Willekeurige kleurengenerator

Gezien deze functie wil ik de kleurvervangen door een willekeurige kleurengenerator.

document.overlay = GPolyline.fromEncoded({
    color: "#0000FF",
    weight: 10,
    points: encoded_points,
    zoomFactor: 32,
    levels: encoded_levels,
    numLevels: 4
});

Hoe kan ik dat doen?


Antwoord 1, autoriteit 100%

Gebruik getRandomColor()in plaats van "#0000FF":

function getRandomColor() {
  var letters = '0123456789ABCDEF';
  var color = '#';
  for (var i = 0; i < 6; i++) {
    color += letters[Math.floor(Math.random() * 16)];
  }
  return color;
}
function setRandomColor() {
  $("#colorpad").css("background-color", getRandomColor());
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="colorpad" style="width:300px;height:300px;background-color:#000">
</div>
<button onclick="setRandomColor()">Random Color</button>

Antwoord 2, autoriteit 26%

Ik betwijfel of iets sneller of korter zal zijn dan deze:

"#" + ((1<<24)*Math.random() | 0).toString(16)

Uitdaging!


Antwoord 3, autoriteit 15%

Hier is nog een andere kijk op dit probleem.

Mijn doel was om levendige en duidelijke kleuren te creëren. Om ervoor te zorgen dat de kleuren verschillend zijn, vermijd ik het gebruik van een willekeurige generator en selecteer de kleuren “gelijkmatig gespaden” van de regenboog.

Dit is perfect voor het maken van pop-outmarkeringen in Google Maps die optimaal “uniekheid” hebben (dat wil zeggen, geen twee markers zullen vergelijkbare kleuren hebben).

function rainbow(numOfSteps, step) {
    // This function generates vibrant, "evenly spaced" colours (i.e. no clustering). This is ideal for creating easily distinguishable vibrant markers in Google Maps and other apps.
    // Adam Cole, 2011-Sept-14
    // HSV to RBG adapted from: http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
    var r, g, b;
    var h = step / numOfSteps;
    var i = ~~(h * 6);
    var f = h * 6 - i;
    var q = 1 - f;
    switch(i % 6){
        case 0: r = 1; g = f; b = 0; break;
        case 1: r = q; g = 1; b = 0; break;
        case 2: r = 0; g = 1; b = f; break;
        case 3: r = 0; g = q; b = 1; break;
        case 4: r = f; g = 0; b = 1; break;
        case 5: r = 1; g = 0; b = q; break;
    }
    var c = "#" + ("00" + (~ ~(r * 255)).toString(16)).slice(-2) + ("00" + (~ ~(g * 255)).toString(16)).slice(-2) + ("00" + (~ ~(b * 255)).toString(16)).slice(-2);
    return (c);
}

Als u wilt zien wat dit lijkt in actie, zie Simple Javascript Rainbow Color Generator voor Google Map Markers .


Antwoord 4, Autoriteit 5%

wie kan het verslaan?

'#' + Math.random().toString(16).substr(-6);

Het is gegarandeerd om de hele tijd te werken : http: // jsbin .com / ojelifo / 2 / bewerken

Gebaseerd op eterps’s commentaar , de bovenstaande code kan nog steeds kortere snaren genereren als de Hexadecimale weergave van de willekeurige kleur is erg kort (0.730224609375= & gt; 0.baf).

Deze code moet in alle gevallen werken:

function makeRandomColor(){
  var c = '';
  while (c.length < 7) {
    c += (Math.random()).toString(16).substr(-6).substr(-1)
  }
  return '#' + c;
}

Antwoord 5, Autoriteit 4%

U kunt ook HSL gebruiken die beschikbaar is op elke goede browser (http://caniuse.com/#Feat = CSS3-kleuren )

function randomHsl() {
    return 'hsla(' + (Math.random() * 360) + ', 100%, 50%, 1)';
}

Hiermee geeft u alleen felle kleuren, u kunt spelen met de helderheid, verzadiging en alfa.

// es6
const randomHsl = () => `hsla(${Math.random() * 360}, 100%, 50%, 1)`

Antwoord 6, Autoriteit 2%

Er is geen hash van hexadecimale letters nodig. Javascript kan dit zelf doen:

function get_random_color() {
  function c() {
    var hex = Math.floor(Math.random()*256).toString(16);
    return ("0"+String(hex)).substr(-2); // pad with zero
  }
  return "#"+c()+c()+c();
}

Antwoord 7, Autoriteit 2%

Ik vind deze leuk: '#' + (Math.random().toString(16) + "000000").substring(2,8)


Antwoord 8, autoriteit 2%

Willekeurige kleurgeneratie met helderheidsregeling:

function getRandColor(brightness){
    // Six levels of brightness from 0 to 5, 0 being the darkest
    var rgb = [Math.random() * 256, Math.random() * 256, Math.random() * 256];
    var mix = [brightness*51, brightness*51, brightness*51]; //51 => 255/5
    var mixedrgb = [rgb[0] + mix[0], rgb[1] + mix[1], rgb[2] + mix[2]].map(function(x){ return Math.round(x/2.0)})
    return "rgb(" + mixedrgb.join(",") + ")";
}

Antwoord 9, autoriteit 2%

Het artikel geschreven door Paul Irish, Random Hex Color Code Generator in JavaScript, is absoluut geweldig. Gebruik:

'#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0');

Dank aan Haytam voor het delenvan de padStartom het probleem met de lengte van de hexadecimale code op te lossen.


Antwoord 10, autoriteit 2%

'#'+Math.random().toString(16).slice(-3) // three-numbers format aka #f3c
'#'+Math.random().toString(16).slice(-6) // six-number format aka #abc123

Antwoord 11, autoriteit 2%

Als je een noob bent zoals ik, geen idee hebt van hexadecimalen en dergelijke, is dit misschien meer intuïtief.

function r() { return Math.floor(Math.random() * 255) }
var color = 'rgb(' + r() + "," + r() + "," + r() + ')';

U hoeft alleen maar te eindigen met een string zoals 'rgb(255, 123, 220)'


Antwoord 12

Hier is een draai aan de oplossing van @anatoliy.

Ik moest alleen lichte kleuren (voor achtergronden) genereren, dus ik ging met drie letter (#aaa) formaat:

function get_random_color() {
    var letters = 'ABCDE'.split('');
    var color = '#';
    for (var i=0; i<3; i++ ) {
        color += letters[Math.floor(Math.random() * letters.length)];
    }
    return color;
}

Antwoord 13

Gebruik:

function random_color(format)
{
    var rint = Math.round(0xffffff * Math.random());
    switch(format)
    {
        case 'hex':
            return ('#0' + rint.toString(16)).replace(/^#0([0-9a-f]{6})$/i, '#$1');
            break;
        case 'rgb':
            return 'rgb(' + (rint >> 16) + ',' + (rint >> 8 & 255) + ',' + (rint & 255) + ')';
            break;
        default:
            return rint;
            break;
    }
}

Bijgewerkte versie:

function random_color( format ){
  var rint = Math.floor( 0x100000000 * Math.random());
  switch( format ){
    case 'hex':
      return '#' + ('00000'   + rint.toString(16)).slice(-6).toUpperCase();
    case 'hexa':
      return '#' + ('0000000' + rint.toString(16)).slice(-8).toUpperCase();
    case 'rgb':
      return 'rgb('  + (rint & 255) + ',' + (rint >> 8 & 255) + ',' + (rint >> 16 & 255) + ')';
    case 'rgba':
      return 'rgba(' + (rint & 255) + ',' + (rint >> 8 & 255) + ',' + (rint >> 16 & 255) + ',' + (rint >> 24 & 255)/255 + ')';
    default:
      return rint;
  }
}

Antwoord 14

var color = "#";
for (k = 0; k < 3; k++) {
    color += ("0" + (Math.random()*256|0).toString(16)).substr(-2);
}

Een overzicht van hoe dit werkt:

Math.random()*256krijgt een willekeurig (zwevende komma) getal van 0 tot 256 (inclusief 0 tot 255)
Voorbeeld resultaat: 116.15200161933899

Door de |0toe te voegen, wordt alles na de komma verwijderd.
Vb: 116.15200161933899 -> 116

Door .toString(16)te gebruiken, wordt dit getal geconverteerd naar hexadecimaal (grondtal 16).
Vb: 116 -> 74
Een ander voorbeeld: 228 -> e4

Door "0"toe te voegen, wordt het aangevuld met een nul. Dit is belangrijk wanneer we de subtekenreeks krijgen, omdat ons eindresultaat twee tekens voor elke kleur moet hebben.
Vb: 74 -> 074
Een ander voorbeeld: 8 -> 08

.substr(-2)krijgt alleen de laatste twee tekens.
Vb: 074 -> 74
Een ander voorbeeld: 08 -> 08 (als we de "0"niet hadden toegevoegd, zou dit “8” hebben opgeleverd in plaats van “08”)

De forlus voert deze lus drie keer uit, waarbij elk resultaat aan de kleurreeks wordt toegevoegd, wat zoiets als dit oplevert:
#7408e4


Antwoord 15

Een kort antwoord met opvulling op de exacte maat:

'#' + ((1<<24)*(Math.random()+1)|0).toString(16).substr(1)

Antwoord 16

De bovenste opmerking van het bovenste antwoord suggereert dat de aanpak van Martin Ankerl beter is dan willekeurige hex-nummers, en hoewel ik niet ben verbeterd op de methodologie van Ankerl, heb ik het met succes vertaald naar JavaScript.

Ik dacht dat ik een extra antwoord op deze reeds mega-sized Stack & NBSP zou plaatsen; overloopvraag omdat het bovenste antwoord een andere opmerking heeft met een gist met de JavaScript-implementatie van de logica van Ankerl en die link is verbroken (404). Als ik de reputatie had, zou ik gewoon de JSBIN-link hebben gemaakt die ik heb gemaakt.

// Adapted from
// http://jsfiddle.net/Mottie/xcqpF/1/light/
const rgb2hex = (rgb) => {
  return (rgb && rgb.length === 3) ? "#" +
    ("0" + parseInt(rgb[0],10).toString(16)).slice(-2) +
    ("0" + parseInt(rgb[1],10).toString(16)).slice(-2) +
    ("0" + parseInt(rgb[2],10).toString(16)).slice(-2) : '';
}
// The next two methods are converted from Ruby to JavaScript.
// It is sourced from http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/
// # HSV values in [0..1[
// # returns [r, g, b] values from 0 to 255
const hsv_to_rgb = (h, s, v) => {
  const h_i = Math.floor(h*6)
  const f = h*6 - h_i
  const p = v * (1 - s)
  const q = v * (1 - (f * s))
  const t = v * (1 - (1 - f) * s)
  let r, g, b
  switch(h_i) {
    case(0):
      [r, g, b] = [v, t, p]
      break
    case(1):
      [r, g, b] = [q, v, p]
      break
    case(2):
      [r, g, b] = [p, v, t]
      break
    case(3):
      [r, g, b] = [p, q, v]
      break
    case(4):
      [r, g, b] = [t, p, v]
      break
    case(5):
      [r, g, b] = [v, p, q]
      break
  }
  return [Math.floor(r * 256), Math.floor(g * 256), Math.floor(b * 256)]
}
// # Use the golden ratio
const golden_ratio_conjugate = 0.618033988749895
let h = Math.random() // # Use a random start value
const gen_hex = (numberOfColors) => {
  const colorArray = []
  while (numberOfColors > 0) {
    h += golden_ratio_conjugate
    h %= 1
    colorArray.push(rgb2hex(hsv_to_rgb(h, 0.99, 0.99)))
    numberOfColors -= 1
  }
  console.log(colorArray)
  return colorArray
}
gen_hex(100)

https://jsbin.com/qeyevoj/edit?js,console


Antwoord 17

kaart

retourneert altijd een geldigeRGB-kleur:

`rgb(${[1,2,3].map(x=>Math.random()*256|0)})`

Antwoord 18

regexp

retourneert altijd een geldige hexadecimale kleur van 6 cijfers

"#xxxxxx".replace(/x/g, y=>(Math.random()*16|0).toString(16))

Antwoord 19

Dus hoewel alle antwoorden hier goed zijn, wilde ik wat meer controle over de uitvoer. Ik wil bijvoorbeeld bijna witte tinten voorkomen, en er tegelijkertijd voor zorgen dat ik heldere, levendige kleuren krijg en geen vervaagde tinten.

function generateColor(ranges) {
            if (!ranges) {
                ranges = [
                    [150,256],
                    [0, 190],
                    [0, 30]
                ];
            }
            var g = function() {
                //select random range and remove
                var range = ranges.splice(Math.floor(Math.random()*ranges.length), 1)[0];
                //pick a random number from within the range
                return Math.floor(Math.random() * (range[1] - range[0])) + range[0];
            }
            return "rgb(" + g() + "," + g() + "," + g() +")";
        };

Dus nu kan ik 3 willekeurige bereiken specificeren om rgb-waarden uit te kiezen. Je kunt het zonder argumenten aanroepen en mijn standaardset krijgen die meestal een behoorlijk levendige kleur genereert met een ooit voor de hand liggende dominante tint, of je kunt je eigen reeks reeksen leveren.


Antwoord 20

Er zijn zoveel manieren waarop u dit kunt bereiken. Hier is wat ik heb gedaan:

Genereert zes willekeurige hexadecimale cijfers (0-F)

function randColor() {
    for (var i=0, col=''; i<6; i++) {
        col += (Math.random()*16|0).toString(16);
    }
    return '#'+col;
}

Extreem korte oneliner

'#'+(Math.random().toString(16)+'00000').slice(2,8)

Genereert individuele HEX-componenten (00-FF)

function randColor2() {
    var r = ('0'+(Math.random()*256|0).toString(16)).slice(-2),
        g = ('0'+(Math.random()*256|0).toString(16)).slice(-2),
        b = ('0'+(Math.random()*256|0).toString(16)).slice(-2);
    return '#' +r+g+b;
}

Over-engineered hex string (XORs 3 uitgangen samen om kleur te vormen)

function randColor3() {
    var str = Math.random().toString(16) + Math.random().toString(16),
    sg = str.replace(/0./g,'').match(/.{1,6}/g),
    col = parseInt(sg[0], 16) ^ 
          parseInt(sg[1], 16) ^ 
          parseInt(sg[2], 16);
    return '#' + ("000000" + col.toString(16)).slice(-6);
}

Antwoord 21

Je zou deze eenvoudige functie kunnen gebruiken

function getRandomColor(){
 var color =  "#" + (Math.random() * 0xFFFFFF << 0).toString(16);
 return color;
}

Antwoord 22

Voor behoorlijke willekeur.

Willekeurige kleur

`#${crypto.getRandomValues(new Uint32Array(1))[0].toString(16).padStart(8, 0).slice(-6)}`

Willekeurige alfa, willekeurige kleur.

`#${crypto.getRandomValues(new Uint32Array(1))[0].toString(16).padStart(8, 0)}`

Antwoord 23

Nog een willekeurige kleurengenerator:

var randomColor;
randomColor = Math.random() * 0x1000000; // 0 < randomColor < 0x1000000 (randomColor is a float)
randomColor = Math.floor(randomColor); // 0 < randomColor <= 0xFFFFFF (randomColor is an integer)
randomColor = randomColor.toString(16); // hex representation randomColor
randomColor = ("000000" + randomColor).slice(-6); // leading zeros added
randomColor = "#" + randomColor; // # added

Antwoord 24

Gebruik verschillende kleuren.

Het genereert een palet van visueelverschillende kleuren.

distinct-colors is zeer configureerbaar:

  • Kies hoeveel kleuren er in het palet zitten
  • Beperk de tint tot een specifiek bereik
  • Beperk de chroma (verzadiging) tot een specifiek bereik
  • Beperk de lichtheid tot een specifiek bereik
  • Algemene kwaliteit van het palet configureren

Antwoord 25

Array.prototype.reducemaakt het erg schoon.

["r", "g", "b"].reduce(function(res) {
    return res + ("0" + ~~(Math.random()*256).toString(16)).slice(-2)
}, "#")

Het heeft een shim nodig voor oude browsers.


Antwoord 26

function get_random_color() {
    return "#" + (Math.round(Math.random() * 0XFFFFFF)).toString(16);
}

http://jsfiddle.net/xmqdz/1/


Antwoord 27

Mijn versie:

function RandomColor() {
  var hex = (Math.round(Math.random()*0xffffff)).toString(16);
  while (hex.length < 6) hex = "0" + hex;
  return hex;
}

Antwoord 28

Een beetje verbeterde one-liner om de aanpak meer levendig te maken

'#' + Math.round((0x1000000 + 0xffffff * Math.random())).toString(16).slice(1)

Antwoord 29

Bijna alle vorige korte handmethoden genereren ongeldige HEX-codes (vijf cijfers). Ik kwam alleen een vergelijkbare techniek tegen zonder dat probleem hier :

"#"+(((1+Math.random())*(1<<24)|0).toString(16)).substr(-6)

Test

Probeer dit in de console:

for(i = 0; i < 200; i++) {
    console.log("#"+(((1+Math.random())*(1<<24)|0).toString(16)).substr(-6));
}

Antwoord 30

U moet '#'+Math.floor(Math.random()*16777215).toString(16);gebruiken voor een willekeurige kleurcode.

Je denkt, maar waarom 16777215? Bekijk dit artikel: Genereren een willekeurige kleur met een enkele regel JavaScript-code

function generateRandomColor()
{
    var randomColor = '#'+Math.floor(Math.random()*16777215).toString(16);
    if(randomColor.length != 7){ // In any case, the color code is invalid
        randomColor = generateRandomColor();
    }
    return randomColor;
    // The random color will be freshly served
}
document.body.style.backgroundColor = generateRandomColor() // -> #E1AC94

Other episodes