Zufälliger Farbgenerator


440

Mit dieser Funktion möchte ich die Farbe durch einen zufälligen Farbgenerator ersetzen .

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

Wie kann ich es tun?


31
'#' + Math.floor (Math.random () * 16777215) .toString (16);
September


2
@SepehrM wenn zufällige Rückgabe 0.001dann Ergebnis ist "#4189"(ungültige Farbe - 4 Ziffern)
Kamil Kiełczewski

Dies ist eine sehr schöne Lösung, für mich sehr nützlich github.com/davidmerfield/randomColor
maikelm

5
'#'+Math.random().toString(16).substr(2,6) (Quelle: CodeGolf )
Ashleedawg

Antworten:


1018

Verwendung getRandomColor()anstelle von "#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>


87
Beachten Sie, dass dies aufgrund der Art und Weise, wie RGB den Farbraum umschließt, zu ziemlich dunklen und ungesättigten Farben tendiert. Martin Ankerl hat einen schönen Artikel über das Erzeugen von Farben aus anderen Räumen (wie dem HSV): martin.ankerl.com/2009/12/09/…
Thomas Ahle

13
Die Chancen, bei Verwendung 0 oder 15 zu treffen, Math.round(Math.random()*15)betragen nur 1:30, während die Chancen der anderen Zahlen 1:15 betragen.
user123444555621

3
Sie können den Aufruf von .split ('') entfernen. String haben bereits Array-Indexer.
Ujeenator

3
Sie können auch eine Generatorfunktion als solche verwenden
tsuz

4
Dieser Code ist lahm. Hier ist ein Oneliner: Math.floor (Math.random () * 16777215) .toString (16)
DDD

269

Ich bezweifle, dass etwas schneller oder kürzer sein wird als dieses:

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

Herausforderung!


18
Sie haben vergessen, mit Nullen aufzufüllen.
user123444555621

143
'#'+(Math.random()*0xFFFFFF<<0).toString(16);
Mohsen

15
@Mohsen, FYI hin und wieder Ihr Code produziert ungültige 5-stellige Nummer
Rochal

6
Das Ergebnis ist nicht auf 6 Stellen aufgefüllt
Taha Jahangir

33
('00000'+(Math.random()*(1<<24)|0).toString(16)).slice(-6)wird immer eine Länge von 6 zurückgeben, obwohl diese Methode immer noch (selten) kleine Zahlen zurückgibt , die Ergebnisse wie 000cf4oder 0000a7die ein bisschen hackig sind, denke ich. In diesen Fällen trägt die rote Komponente nicht zur zufälligen Farbe bei.
Bryc

162

Hier ist eine andere Sichtweise auf dieses Problem.

Mein Ziel war es, lebendige und unverwechselbare Farben zu kreieren. Um sicherzustellen, dass die Farben unterschiedlich sind, vermeide ich die Verwendung eines Zufallsgenerators und wähle "gleichmäßig verteilte" Farben aus dem Regenbogen aus.

Dies ist ideal zum Erstellen von Popout-Markierungen in Google Maps mit optimaler "Eindeutigkeit" (dh keine zwei Markierungen haben ähnliche Farben).

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);
}

Wenn Sie sehen möchten, wie dies in Aktion aussieht, lesen Sie http://blog.adamcole.ca/2011/11/simple-javascript-rainbow-color.html .


7
Ich habe nach so etwas gesucht! Tolles Zeug!
Khôi

Ich habe dieselbe Idee vereinfacht implementiert wie die Antwort auf eine ähnliche Frage stackoverflow.com/a/14187677/421010
Andrew

15
Was ist also der Wert des Parameters?
Ekramul Hoque

2
Ich habe auch so etwas geschaffen, aber es ist ziemlich zufällig und ziemlich verschieden. Der Pseudocode ist hier . Es verwendet hsv anstelle von rgb, da hsv ein viel vorhersehbareres Verhalten aufweist. Wenn Sie die Python-Implementierung sehen möchten, habe ich sie hier und hier verwendet . Sie müssen den Code nach "Farbe" durchsuchen.
Zondo

1
@ RobertMolina: Entschuldigung, ich habe meine Sachen nach Gitlab verschoben. Der Pseudocode ist jetzt hier , mit den Projekten hier und hier .
Zondo

56

Wer kann es schlagen?

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

Garantiert die ganze Zeit zu arbeiten: http://jsbin.com/OjELIfo/2/edit

Basierend auf dem Kommentar von @eterps kann der obige Code immer noch kürzere Zeichenfolgen erzeugen, wenn die hexadezimale Darstellung der zufälligen Farbe sehr kurz ist (0.730224609375 => 0.baf).

Dieser Code sollte in allen Fällen funktionieren:

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

12
Wenn Math.random () 0.022092682472568126 zurückgibt, erzeugt dieser Code eine ungültige Zeichenfolge '# 5a7dd'. verrückt!
Rochal

Wie dieses, da #ffffff nicht zu oft erscheint.
Warface

Es gibt einige Fälle, in denen dies nicht funktioniert. Überprüfen Sie die folgende Ausgabe für Math.random () ... 0.730224609375, 0.43603515625, 0.957763671875, und die Liste geht weiter ...
eterps

@eterps Das sind KEINE richtigen Zufallszahlen ! Siehe IEEE 754 Double in Hex : 0.730224609375 = 0x3fe75e0000000000, 0.43603515625 = 0x3fdbe80000000000, 0.957763671875 = 0x3feea60000000000. Kaum eine der Mantissen wird benutzt! Sie sind nur verherrlichte Brüche. Eine korrekte 12-stellige Ausgabe würde zu folgenden Ergebnissen führen:0.347876714234 = 0x3fd6439cb1ab32ac, 0.447556256665 = 0x3fdca4c2ff5fc450
Bryc

Ich glaube, dass seit 2015 viele Webbrowser die beschissenen PRNGs, die unter der Haube verwendet werden Math.random()(von denen ich annehmen muss, dass sie für die Ergebnisse von @ etertp verantwortlich sind), durch bessere ersetzt haben. Daher sollten diese Arten von Zufallszahlen von geringer Qualität der Vergangenheit angehören jetzt.
Bryc

29

Es ist kein Hash mit hexadezimalen Buchstaben erforderlich. JavaScript kann dies selbst tun:

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();
}

29

Sie können HSL auch in jedem guten Browser verwenden ( http://caniuse.com/#feat=css3-colors ).

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

Dies gibt Ihnen nur helle Farben, Sie können mit der Helligkeit, Sättigung und Alpha herumspielen.

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

Vielen Dank! Ich habe es geschafft, perfekte Farben für Hintergründe zu bekommen mit:'hsla(' + (Math.floor(Math.random()*360) + ', 100%, 70%, 1)'
jj_

1
Kein Problem, ich war überrascht zu sehen, dass niemand die Kraft von
hsl

stackoverflow.com/a/23861752/1693593 , hsla wird nicht benötigt es ist alpha = 1, benutze einfach

1
Sie können auf diese Weise keine 16M-Farbe erzeugen (z. B. erhalten Sie niemals weiß-schwarze Graustufen) - aber ja - wenn wir für jede Komponente zufällig verwenden, erhalten wir alle hsl-Corols
Kamil Kiełczewski

1
+1 Dies macht es einfacher, Helligkeit und Sättigung zu verwenden, um zufällige Hintergrundfarben festzulegen und gleichzeitig sicherzustellen, dass der Text immer lesbar ist
Osvaldo Maria

27

Ich mag dieses: '#' + (Math.random().toString(16) + "000000").substring(2,8)


Oder'#' + Math.floor(Math.random()*16777215).toString(16);
Mohammad Anini

@MohammadAnin, der eine 1: 16-Chance hat, weniger als 6 Ziffern zu produzieren
James

1
Dies kann zu ungültigen Farben führen. Zum Beispiel '#' + (0.125).toString(16).substring(2, 8) === '#2'. Es ist gefährlich, weil die Wahrscheinlichkeit gering ist (1 in 4096, glaube ich), so dass ein Fehler wahrscheinlich durch Tests kommt. Sie sollten ('#' + Math.random().toString(16) + "000000").substring(2, 8)
James

Korrektur: sollte sein'#' + (Math.random().toString(16) + "000000").substring(2,8)
James

25

Zufällige Farberzeugung mit Helligkeitsregelung:

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(",") + ")";
}

1
Sehr cool, obwohl meistens eher Pastellfarben als lebendigere Farben erzeugt werden, auf die ich gehofft hatte, als ich Helligkeit sah. Ich gehe immer noch in meine Trickkiste!
JayCrossler

Ich mag dieses wirklich, weil Sie es so anpassen können, dass es mit Ihrer Website-Farbpalette
harmoniert

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

Ich mag dies für seine Lesbarkeit
hitautodestruct

1
Wenn die Math.random()Rückgabe erfolgt, 0.125ist das Ergebnis #0.2(ungültige Farbe) (Sie müssen etwas Polster anstelle der Scheibe hinzufügen)
Kamil Kiełczewski

18

Der Artikel von Paul Irish über Random Hex Color Code Generator in JavaScript ist absolut erstaunlich. Verwenden:

'#'+Math.floor(Math.random()*16777215).toString(16);

Hier ist der Quelllink:

http://www.paulirish.com/2009/random-hex-color-code-snippets/


5
Dies wird manchmal nicht wohlgeformte Farbwerte wie "1fa4c" zurückgeben (muss 3 oder 6 Zeichen sein)
jj_

1
@jj_ ist es? Entschuldigung, das habe ich nicht bemerkt. Vielen Dank für das Teilen
way2vin

Wenn zufällige Rückgabe 0.00001dann Ergebnis ist #a7(ungültige Farbe)
Kamil Kiełczewski

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

17

Hier ist eine Variante der von @Anatoliy bereitgestellten Lösung.

Ich musste nur helle Farben (für Hintergründe) erzeugen, also habe ich mich für das Drei-Buchstaben-Format (#AAA) entschieden:

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;
}

Ich denke, dies wird wahrscheinlich am häufigsten Farben erzeugen, die sehr ähnlich sind, obwohl sie hell sind. Für eine spärlichere Auswahl an zufälligen Farben denke ich, dass @ Anatolis Reaktion größtenteils besser ist
larrytech

15

Wenn Sie ein Noob wie ich sind und keine Ahnung von Hexadezimalen und dergleichen haben, ist dies möglicherweise intuitiver.

function r() { return Math.floor(Math.random() * 255) }

var color = 'rgb(' + r() + "," + r() + "," + r() + ')';

Sie müssen nur mit einer Zeichenfolge wie enden 'rgb(255, 123, 220)'


Diese Antwort muss die beste sein
Gil Epshtain

Sie müssten jedoch 256 verwenden, um 0 zu erhalten.
Lisa Cerilli

13

Dies kann sehr einfach mit der Google-Suche gefunden werden:

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;
    }
}

Aktualisierte Version:

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;
  }
}

1
Vielleicht so; Aber zu welcher Website würden Sie die möglichen Google Adwords-Einnahmen bevorzugen? =)
David sagt, Monica

2
Welche Seite gibt Ihnen die Antwort? Wenn sie Ihnen die Antwort geben, sollten sie die Treffer erhalten.
Funky Dude

1
@FunkyDude jetzt ist dieses Ergebnis das beste bei Google und der Grund, warum Stackoverflow existiert, ist, Google nicht zu oft zu verwenden;)
Akshat

10

Kurze Antwort mit Block auf exakte Größe

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


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

Eine Aufschlüsselung, wie dies funktioniert:

Math.random()*256 erhält eine Zufallszahl (Gleitkommazahl) von 0 bis 256 (0 bis einschließlich 255)
Beispielergebnis: 116.15200161933899

Fügen Sie die |0Streifen von allem nach dem Dezimalpunkt hinzu.
Beispiel: 116.15200161933899 -> 116

Mit .toString(16)konvertiert diese Zahl in hexadezimal (Basis 16).
Beispiel: 116 -> 74
Ein weiteres Beispiel: 228 -> e4

Hinzufügen "0"Pads es mit einer Null. Dies ist wichtig, wenn wir den Teilstring erhalten, da unser Endergebnis zwei Zeichen für jede Farbe haben muss.
Beispiel: 74 -> 074
Ein weiteres Beispiel: 8 -> 08

.substr(-2)bekommt nur die letzten beiden Zeichen.
Beispiel: 074 -> 74
Ein weiteres Beispiel: 08 -> 08 (wenn wir das nicht hinzugefügt hätten"0" , hätte dies "8" anstelle von "08" ergeben)

Die forSchleife führt diese Schleife dreimal aus und fügt jedes Ergebnis der Farbzeichenfolge hinzu, wodurch Folgendes erzeugt wird:
#7408e4


Sie sollten Ihre Antwort konkretisieren.
Joce

8

Obwohl alle Antworten hier gut sind, wollte ich etwas mehr Kontrolle über die Ausgabe. Zum Beispiel möchte ich nahezu weiße Farbtöne vermeiden und gleichzeitig sicherstellen, dass ich helle, lebendige Farben erhalte, die nicht ausgewaschen sind.

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() +")";
        };

Jetzt kann ich 3 beliebige Bereiche angeben, aus denen RGB-Werte ausgewählt werden sollen. Sie können es ohne Argumente aufrufen und meinen Standardsatz erhalten, der normalerweise eine ziemlich lebendige Farbe mit einem einmal offensichtlich dominanten Farbton erzeugt, oder Sie können Ihre eigene Reihe von Bereichen angeben.


1
Die Google Map API unterstützt nur hexadezimale HTML-Farben im Format "#FFFFFF".
Valery Viktorovsky

Sicher, es ist ziemlich einfach, eine Zahl in hexadezimal n.toString (16) umzuwandeln.
Ollie Edwards

8

Der am besten bewertete Kommentar der Top-Antwort deutet darauf hin, dass Martin Ankerls Ansatz besser ist als zufällige Hex-Zahlen, und obwohl ich Ankerls Methodik nicht verbessert habe, habe ich ihn erfolgreich in JavaScript übersetzt. Ich dachte, ich würde eine zusätzliche Antwort auf diesen bereits mega-großen SO-Thread posten, da die oberste Antwort einen weiteren Kommentar enthält, der auf einen Gist mit der JS-Implementierung von Ankerls Logik verweist, und dieser Link ist unterbrochen (404). Wenn ich den Ruf hätte, hätte ich einfach den von mir erstellten jsbin-Link kommentiert.

// 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) : '';
}

// next two methods converted from Ruby to JS
// soured 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 golden ratio
const golden_ratio_conjugate = 0.618033988749895
let h = Math.random() // # use 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


7

Für anständige Zufälligkeit.

Zufällige Farbe

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

Zufälliges Alpha, zufällige Farbe.

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

7

Es gibt so viele Möglichkeiten, dies zu erreichen. Hier sind einige, die ich gemacht habe:

Erzeugt sechs zufällige Hex-Ziffern (0-F)

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

Extrem kurzer Einzeiler

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

Erzeugt einzelne HEX-Komponenten (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;
}

Überentwickelte Hex-Zeichenfolge (XORs 3 gibt zusammen aus, um Farbe zu bilden)

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);
}

extremley shor one-liner: Wenn zufällige 0.125Ergebnisse #0.2
vorliegen,

@ KamilKiełczewski 0.125= 3FC0000000000000in IEEE hex. 3 hexadezimale Ziffern sind Exponenten, 13 sind Mantissen. Es besteht eine Wahrscheinlichkeit von 1 zu 4,5 Billiarden, dass die Mantisse so vollständig leer ist. Ich habe 100m mal in Firefox / Chrome getestet. Du versuchst nur es zu brechen;). Math.randomsollte dir niemals 0,125 geben. Und wenn ja, gibt es ein Problem mit dem PRNG, das nicht mein Problem ist. Brüche wie 0,5, 0,25, 0,0625 usw. sind nutzlos, sie enthalten keine Zufälligkeit. Vielleicht haben Sie eine Lösung für diesen extremen Randfall, hm? ;)
Bryc

Ja, '#'+Math.random().toString(16).split('.')[1].slice(-6).padStart(6,0)aber ich bevorzuge dies
Kamil Kiełczewski

6

Noch ein zufälliger Farbgenerator:

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

6

Array.prototype.reduce macht es sehr sauber.

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

Benötigt eine Unterlegscheibe für alte Browser.


in Chrom Konsole immer zurückkehren # 000000
Kamil Kiełczewski

6

Sie können diese einfache Funktion verwenden

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

1
Wenn zufällig zurückgegeben wird, ist 0.001das Ergebnis "#4189"(ungültige Farbe 4 Ziffern)
Kamil Kiełczewski


5

Verwenden Sie unterschiedliche Farben .

Es wird eine Palette von visuell unterschiedlichen Farben erzeugt.

eindeutige Farben sind hoch konfigurierbar:

  • Wählen Sie aus, wie viele Farben in der Palette enthalten sind
  • Beschränken Sie den Farbton auf einen bestimmten Bereich
  • Beschränken Sie die Farbintensität (Sättigung) auf einen bestimmten Bereich
  • Beschränken Sie die Helligkeit auf einen bestimmten Bereich
  • Konfigurieren Sie die allgemeine Qualität der Palette

3541 Codezeilen ... wo andere Antworten hier sind ~ 6-10 Zeilen ... Ich bin beeindruckt, wie jemand so viele Codezeilen geschrieben hat, nur um bestimmte Farben
auszuwählen

Das Auswählen wirklich visuell unterschiedlicher Farben erfordert viel mehr Mathematik als nur einen zufälligen Farbgenerator.
InternalFX

Ich habe es gerade in 2 Zeilen gemacht. Diese Funktion wurde geändert: stackoverflow.com/a/20129594/104380
vsync

Es ist nicht so einfach. vorgeschlagen Lesung
InternalFX

Danke, sehr interessanter Artikel. Meine Methode liefert immer die gleichen Farben und die Ergebnisse sind konsistent und unverwechselbar. Ich denke, in einigen Situationen benötigen Sie möglicherweise wirklich zufällige, gut verteilte Farben, die für das menschliche Auge hübsch sind.
vsync

3

Hier sind meine beiden Versionen für einen zufälligen Hex-Code-Generator.


/* Slowest but shortest. */
"#000000".replace(/0/g,function(){return (~~(Math.random()*16)).toString(16);});    

/* Good performance with small size. */
"#"+(function(a,b){while(a--){b+=""+(~~(Math.random()*16)).toString(16);} return b;})(6,"");

/* Remy Sharp provided one that's the fastest but a little bit too long */
(function(h){return '#000000'.substr(0,7-h.length)+h})((~~(Math.random()*(1<<24))).toString(16))


3

Diese Funktion geht in zweierlei Hinsicht über andere Antworten hinaus:

Es wird versucht, möglichst unterschiedliche Farben zu erzeugen, indem ermittelt wird, welche Farbe aus 20 Versuchen den weitesten euklidischen Abstand zu den anderen im HSV-Kegel aufweist

Sie können den Farbton, die Sättigung oder den Wertebereich einschränken, versuchen jedoch weiterhin, Farben auszuwählen, die innerhalb dieses Bereichs so unterschiedlich wie möglich sind.

Es ist nicht sehr effizient, aber für vernünftige Werte (wer könnte sogar 100 Farben leicht auseinander nehmen?) Ist es schnell genug.

Siehe JSFiddle

  /**
   * Generates a random palette of HSV colors.  Attempts to pick colors
   * that are as distinct as possible within the desired HSV range.
   *
   * @param {number}    [options.numColors=10] - the number of colors to generate
   * @param {number[]}  [options.hRange=[0,1]] - the maximum range for generated hue
   * @param {number[]}  [options.sRange=[0,1]] - the maximum range for generated saturation
   * @param {number[]}  [options.vRange=[0,1]] - the maximum range for generated value
   * @param {number[][]}[options.exclude=[[0,0,0],[0,0,1]]] - colors to exclude
   * 
   * @returns {number[][]} an array of HSV colors (each HSV color 
   * is a [hue, saturation, value] array)
   */
  function randomHSVPalette(options) {
    function random(min, max) {
      return min + Math.random() * (max - min);
    } 

    function HSVtoXYZ(hsv) {
      var h = hsv[0];
      var s = hsv[1];
      var v = hsv[2];
      var angle = h * Math.PI * 2;
      return [Math.sin(angle) * s * v,
              Math.cos(angle) * s * v,
              v];
    }

    function distSq(a, b) {
      var dx = a[0] - b[0];
      var dy = a[1] - b[1];
      var dz = a[2] - b[2];
      return dx * dx + dy * dy + dz * dz;
    }

    if (!options) {
      options = {};
    }

    var numColors = options.numColors || 10;
    var hRange = options.hRange || [0, 1];
    var sRange = options.sRange || [0, 1];
    var vRange = options.vRange || [0, 1];
    var exclude = options.exclude || [[0, 0, 0], [0, 0, 1]];

    var points = exclude.map(HSVtoXYZ);
    var result = [];

    while (result.length < numColors) {
      var bestHSV;
      var bestXYZ;
      var bestDist = 0;
      for (var i = 0; i < 20; i++) {
        var hsv = [random(hRange[0], hRange[1]), random(sRange[0], sRange[1]), random(vRange[0], vRange[1])];
        var xyz = HSVtoXYZ(hsv);
        var minDist = 10;
        points.forEach(function(point) {
          minDist = Math.min(minDist, distSq(xyz, point));
        });
        if (minDist > bestDist) {
          bestHSV = hsv;
          bestXYZ = xyz;
          bestDist = minDist;
        }
      }
      points.push(bestXYZ);
      result.push(bestHSV);
    }

    return result;
  }

  function HSVtoRGB(hsv) {
    var h = hsv[0];
    var s = hsv[1];
    var v = hsv[2];

    var i = ~~(h * 6);
    var f = h * 6 - i;
    var p = v * (1 - s);
    var q = v * (1 - f * s);
    var t = v * (1 - (1 - f) * s);
    v = ~~(255 * v);
    p = ~~(255 * p);
    q = ~~(255 * q); 
    t = ~~(255 * t);
    switch (i % 6) {
      case 0: return [v, t, p];
      case 1: return [q, v, p];
      case 2: return [p, v, t];
      case 3: return [p, q, v];
      case 4: return [t, p, v];
      case 5: return [v, p, q];
    }
  }

  function RGBtoCSS(rgb) {
    var r = rgb[0];
    var g = rgb[1];
    var b = rgb[2];
    var rgb = (r << 16) + (g << 8) + b;
    return '#' + ('000000' + rgb.toString(16)).slice(-6);
  }

3

Fast alle bisherigen Kurzhandmethoden generieren ungültige Hex-Codes (fünf Ziffern). Ich bin hier nur ohne dieses Problem auf eine ähnliche Technik gestoßen :

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

Prüfung

Versuchen Sie dies in der Konsole:

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

4
Ich habe eine for-Schleife erstellt, die diesen Code 20000 Mal ausgeführt und nur dann auf die Konsole gedruckt hat, wenn die Länge weniger als 7 betrug, und ich habe einen Fall gefunden, in dem die Zeichenfolge weniger als 6 Zeichen betrug. Ein Problem mit diesem Code besteht auch darin, dass nur die gesamte 6-stellige Zeichenfolge aufgefüllt wird, nicht die einzelnen 2-stelligen Farbcodes. Dies bedeutet, dass der rote Wert eher Nullen enthält als der grüne oder blaue Wert.
Erin Heyming

Wenn zufällig zurückgegeben wird, ist 0.00001das Ergebnis "#000a7"(ungültige Farbe - 5 Stellen)
Kamil Kiełczewski

3

Meine Version:

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

Ich denke, das nicht zufällige 0macht die Farbe nicht randomgenug XD
Shrekuu

Wir erzeugen zufällig eine hexadezinale Zahl von 0bis ffffff. Welches ist eine perfekte gleichmäßige Verteilung . Diese Null dient aus Gründen der Browsernutzung nur zum Vervollständigen der Zeichenfolge. Ich schlage vor, Sie schauen sich diese Lösung genauer an.
Prostakov

Ich habe jedoch einige Anpassungen vorgenommen, die nicht mit Ihrem Kommentar verknüpft sind :)
Prostakov

Danke Prostakov. : D
Shrekuu


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.