यादृच्छिक रंग जनरेटर


440

इस फ़ंक्शन को देखते हुए, मैं रंग को यादृच्छिक रंग जनरेटर के साथ बदलना चाहता हूं ।

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

मैं यह कैसे कर सकता हूं?


31
'#' + Math.floor (math.random () * 16,777,215) .toString (16);
सेफेरम


2
@SephrM जब रैंडम रिटर्न देता है 0.001तो परिणाम "#4189"(अमान्य रंग - 4 अंक)
कामिल कील्सेवस्की

यह एक बहुत अच्छा उपाय है, मेरे लिए बहुत उपयोगी github.com/davidmerfield/randomColor
maikelm

5
'#'+Math.random().toString(16).substr(2,6) (स्रोत: कोडगॉल्फ )
१५

जवाबों:


1018

के getRandomColor()स्थान पर उपयोग करें "#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
ध्यान दें कि आरजीबी रंग के स्थान को जिस तरह से लपेटता है, उसके कारण काफी गहरे और असंतृप्त रंगों के प्रति पूर्वाग्रह है। मार्टिन एंकर ने अन्य स्थानों (जैसे एचएसवी) से रंग उत्पन्न करने के बारे में एक अच्छा लेख दिया है: martin.ankerl.com/2009/12/09/…
थॉमस अहले

13
उपयोग करते समय 0 या 15 मारने की संभावना Math.round(Math.random()*15)केवल 1:30 है, जबकि अन्य संख्याओं की संभावना 1:15 है।
user123444555621

3
आप .split ('') कॉल हटा सकते हैं। स्ट्रिंग में पहले से ही ऐरे इंडेक्स है।
ujeenator

3
तुम भी एक इस्तेमाल कर सकते हैं जनरेटर समारोह के रूप में इस तरह के
tsuz

5
यह कोड लंगड़ा है। हेइज़ एक ऑनलाइनर: Math.floor (Math.random (* 16777215)) .toString (16)
DDD

269

मुझे संदेह है कि इससे कुछ भी तेज या कम होगा:

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

चुनौती!


18
आप शून्य के साथ पैड करना भूल गए।
user123444555621

144
'#'+(Math.random()*0xFFFFFF<<0).toString(16);
मोहसिन

15
@Mohsen, FYI हर अब और फिर आपका कोड
rochal

6
इसका परिणाम 6 अंकों तक नहीं होता है
ताहा जहाँगीर

33
('00000'+(Math.random()*(1<<24)|0).toString(16)).slice(-6)हमेशा 6. की लंबाई लौटाएगा, हालांकि यह विधि अभी भी (शायद ही कभी) छोटे नंबर लौटाएगी जो परिणाम देते हैं जैसे कि 000cf4या 0000a7जो थोड़ा हैकिया है मुझे लगता है। इन मामलों में लाल घटक यादृच्छिक रंग में योगदान नहीं देता है।
बजे bryc

162

यहाँ इस समस्या पर एक और लेना है।

मेरा लक्ष्य जीवंत और विशिष्ट रंग बनाना था। यह सुनिश्चित करने के लिए कि रंग अलग हैं मैं एक यादृच्छिक जनरेटर का उपयोग करने से बचता हूं और इंद्रधनुष से "समान रूप से फैला हुआ" रंगों का चयन करता हूं।

यह Google मानचित्र में पॉप-आउट मार्कर बनाने के लिए एकदम सही है, जिसमें इष्टतम "विशिष्टता" है (अर्थात, दो मार्करों के समान रंग नहीं होंगे)।

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

यदि आप यह देखना चाहते हैं कि एक्शन में ऐसा क्या दिखता है तो http://blog.adamcole.ca/2011/11/simple-javascript-rainbow-color.html देखें ।


7
मैं कुछ इस तरह की तलाश में था! उत्तम सामग्री!
खोई

मैंने इसी विचार के सरलीकृत कार्यान्वयन को इसी तरह के प्रश्न के जवाब के रूप में बनाया है stackoverflow.com/a/14187677/421010
एंड्रयू

16
तो पैरामीटर का मूल्य क्या होगा?
इकरामुल होक

2
मैंने भी कुछ ऐसा बनाया है, लेकिन यह काफी यादृच्छिक है और काफी अलग है। छद्म कोड यहाँ है । यह आरजीबी के बजाय एचएसवी का उपयोग करता है, क्योंकि एचएसवी में बहुत अधिक अनुमानित व्यवहार है। यदि आप पायथन कार्यान्वयन को देखने के लिए परवाह करते हैं, तो मैंने इसका उपयोग यहां और यहां किया । आपको "रंग" के लिए कोड के माध्यम से खोजना होगा।
22

1
@RobertMolina: क्षमा करें, मैंने अपना सामान Gitlab में स्थानांतरित कर दिया। छद्म कोड अब यहां है , यहां और यहां की परियोजनाओं के साथ ।
जोंडो

56

इसे कौन हरा सकता है?

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

हर समय काम करने की गारंटी: http://jsbin.com/OjELIfo/2/edit

@Eterps के आधार पर कोड ऊपर अभी भी छोटे तार उत्पन्न कर सकता है यदि यादृच्छिक रंग का हेक्साडेसिमल प्रतिनिधित्व बहुत कम है ( 0.730224609375= 0.baf))

यह कोड सभी मामलों में काम करना चाहिए:

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

12
जब Math.random () रिटर्न 0.022092682472568126 यह कोड अमान्य '# 5a7dd' स्ट्रिंग उत्पन्न करता है। पागल!
राचेल

इस तरह से #ffffff अक्सर दिखाई नहीं देता है।
वॉरफेस डेस

वहाँ काफी कुछ घटनाएँ हैं जहाँ यह काम नहीं करेगा। Math.random () के लिए निम्न आउटपुट की जाँच करें ... 0.730224609375, 0.43603515625, 0.957763671875, और लिस्ट आगे
बढ़ती है

@eterps उचित यादृच्छिक संख्या नहीं हैं ! हेक्स में कच्चे IEEE 754 डबल देखें 0.730224609375 = 0x3fe75e0000000000, 0.43603515625 = 0x3fdbe80000000000, 0.957763671875 = 0x3feea60000000000:। बमुश्किल किसी मेंटिस का उपयोग किया जा रहा है! वे महज अंश हैं। एक उचित '12 अंकों 'का उत्पादन परिणाम की तरह होगा:0.347876714234 = 0x3fd6439cb1ab32ac, 0.447556256665 = 0x3fdca4c2ff5fc450
21

2015 के बाद से, मेरा मानना ​​है कि कई वेब ब्राउज़रों ने हुड के तहत उपयोग किए जाने वाले भद्दे PRNG को बदल दिया है Math.random()(जिसके लिए मुझे यह मानना ​​है कि @ etertp के परिणामों के लिए ज़िम्मेदार है) बेहतर हैं, इसलिए उन प्रकार की कम गुणवत्ता वाले यादृच्छिक संख्याएं अतीत की बात होनी चाहिए अभी।
21

29

हेक्साडेसिमल अक्षरों के हैश की कोई आवश्यकता नहीं है। जावास्क्रिप्ट यह अपने आप कर सकता है:

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

आप हर अच्छे ब्राउज़र पर उपलब्ध एचएसएल का भी उपयोग कर सकते हैं ( http://caniuse.com/#feat=css3-colors )

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

यह आपको केवल उज्ज्वल रंग देगा, आप चमक, संतृप्ति और अल्फा के साथ चारों ओर खेल सकते हैं।

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

धन्यवाद! मैं पृष्ठभूमि के लिए एकदम सही रंग प्राप्त करने में कामयाब रहा:'hsla(' + (Math.floor(Math.random()*360) + ', 100%, 70%, 1)'
jj_

1
कोई
संभावना

stackoverflow.com/a/23861752/1693593 , hsla को इसकी जरूरत नहीं है अल्फा = 1, बस hsl का उपयोग करें

1
आप इस तरह से 16M kolor उत्पन्न नहीं कर सकते हैं (जैसे कि आपको कभी सफ़ेद-काले ग्रेस्केल नहीं मिलेंगे) - हालाँकि हाँ - अगर हम प्रत्येक घटक के लिए यादृच्छिक का उपयोग करते हैं तो हमें सभी hsl corols
कामिल Kiełczewski

1
+1 इससे प्रकाश और संतृप्ति का उपयोग करना आसान हो जाता है, ताकि यह सुनिश्चित हो सके कि पाठ हमेशा पठनीय हो
ओस्वाल्डो मारिया

27

मैं यह पसंद है: '#' + (Math.random().toString(16) + "000000").substring(2,8)


या'#' + Math.floor(Math.random()*16777215).toString(16);
मोहम्मद अन्नी

@ मोहम्मदअनिन जो 6 अंकों से कम उत्पादन का 16 में से 1 मौका है
जेम्स

1
इससे अमान्य रंग उत्पन्न हो सकते हैं। उदाहरण के लिए '#' + (0.125).toString(16).substring(2, 8) === '#2'। यह खतरनाक है क्योंकि संभावना कम है (4096 में 1 मुझे लगता है) इसलिए एक बग को परीक्षण के माध्यम से प्राप्त करने की संभावना है। आपको ('#' + Math.random().toString(16) + "000000").substring(2, 8)
जेम्स

सुधार: होना चाहिए'#' + (Math.random().toString(16) + "000000").substring(2,8)
जेम्स

25

चमक नियंत्रण के साथ यादृच्छिक रंग पीढ़ी:

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
बहुत ही शांत, हालांकि अधिक जीवंत रंगों के बजाय 'पेस्टल' उत्पन्न करता है जिसकी मुझे उम्मीद थी जब मैंने चमक देखी थी। अभी भी मेरे बैग की चाल में जा रहा है!
JayCrossler

मुझे यह वास्तव में पसंद है क्योंकि आप इसे अपनी वेबसाइट के रंग तालमेल के अनुरूप बना सकते हैं
इमानुएल जियानिको

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

मुझे इसकी यह पसंद है
hitautodestruct

1
यदि Math.random()वापस लौटा 0.125तो परिणाम #0.2(अमान्य रंग) होगा (आपको स्लाइस के बजाय कुछ पैडिंग जोड़ने की आवश्यकता होगी)
कामिल कीलक्वेस्की

18

जावास्क्रिप्ट में रैंडम हेक्स कलर कोड जेनरेटर पर पॉल आयरिश द्वारा लिखा गया लेख बिल्कुल अद्भुत है। उपयोग:

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

यहाँ स्रोत लिंक है:

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


5
यह कुछ समय में "1fa4c" (3 या 6 वर्णों की आवश्यकता) जैसे गैर-निर्मित रंग मान लौटाएगा
jj_

1
@ जज_ है? खेद है कि मैंने ध्यान नहीं दिया। साझा करने के लिए धन्यवाद
way2vin 18

जब बेतरतीब वापसी होती है 0.00001तो परिणाम #a7(अमान्य रंग) होता है
कामिल कील्वेज़ेस्की

1
'#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')
हयतम

17

यहां @Anatoliy द्वारा प्रदान किए गए समाधान पर एक मोड़ है।

मुझे केवल हल्के रंग (पृष्ठभूमि के लिए) उत्पन्न करने की आवश्यकता थी, इसलिए मैं तीन अक्षर (#AAA) प्रारूप के साथ गया:

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

मुझे लगता है कि यह सबसे अधिक बार रंगों का उत्पादन करने की संभावना है जो प्रकाश के समान निकट हैं। यादृच्छिक रंगों की अधिक विरल श्रेणी के लिए, मुझे लगता है कि @ अनातोली की प्रतिक्रिया सबसे अधिक भाग के लिए बेहतर है
लैरीटेक

15

यदि आप मेरी तरह एक noob हैं, हेक्साडेसिमल और इस तरह के बारे में स्पष्टता, तो यह अधिक सहज हो सकता है।

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

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

आपको बस एक स्ट्रिंग के साथ समाप्त करने की आवश्यकता है जैसे कि 'rgb(255, 123, 220)'


इस उत्तर को शीर्ष पर रहने की आवश्यकता है
गिल एप्सटेन

हालांकि 0 पाने के लिए आपको 256 का उपयोग करना होगा।
लीसा सेरिली 5

13

यह Google खोज का उपयोग करके बहुत आसानी से पाया जा सकता है:

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

अपडेट किया गया वर्ज़न:

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
संभावित हो; लेकिन आप जिस साइट पर Google ऐडवर्ड्स-राजस्व चाहते हैं, वहाँ जाना चाहेंगे? =)
डेविड ने

2
जो भी साइट आपको जवाब देती है? यदि वे आपको उत्तर प्रदान करते हैं, तो उन्हें हिट मिलना चाहिए।
फंकी ड्यूड

1
@FunkyDude अब यह परिणाम Google पर सबसे ऊपर है और इसका कारण स्टैकओवरफ़्लो मौजूद है, अक्सर Google का उपयोग नहीं करना है;)
अक्षत


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

यह कैसे काम करता है:

Math.random()*2560 से 256 (0 से 255 समावेशी) के लिए एक यादृच्छिक (फ्लोटिंग पॉइंट) संख्या प्राप्त होती है।
उदाहरण के लिए: 116.15200161933899

|0दशमलव बिंदु के बाद सब कुछ बंद स्ट्रिप्स जोड़ना ।
Ex: 116.15200161933899 -> 116

का उपयोग करते हुए .toString(16)धर्मान्तरित हेक्साडेसिमल के लिए इस नंबर (आधार 16)।
Ex: 116 -> 74
एक और पूर्व: 228 -> e4

"0"एक शून्य के साथ इसे पैड जोड़ना । यह महत्वपूर्ण होगा जब हम सबस्ट्रिंग प्राप्त करेंगे, क्योंकि हमारे अंतिम परिणाम में प्रत्येक रंग के लिए दो वर्ण होने चाहिए।
Ex: 74 -> 074
एक और पूर्व: 8 -> 08

.substr(-2)बस पिछले दो पात्रों हो जाता है।
Ex: 074 -> 74
एक और पूर्व: 08 -> 08 (यदि हमने नहीं जोड़ा "0"होता, तो इससे "08" के बजाय "8" का उत्पादन होता)

forपाश इस लूप तीन बार चलाता है, रंग स्ट्रिंग के लिए प्रत्येक परिणाम जोड़ने, कुछ इस तरह का निर्माण:
#7408e4


आपको अपना जवाब देना चाहिए।
जॉस

8

इसलिए जब तक यहाँ सभी उत्तर अच्छे हैं मुझे आउटपुट पर थोड़ा और नियंत्रण चाहिए था। उदाहरण के लिए, मैं किसी भी श्वेत रंगों को रोकना चाहूंगा, जबकि यह सुनिश्चित करना कि मुझे चमकीले जीवंत रंग मिले न कि रंगों को धोया जाए।

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

इसलिए अब मैं आरजीबी मूल्यों को लेने के लिए 3 मनमानी रेंज निर्दिष्ट कर सकता हूं। आप इसे बिना किसी तर्क के कॉल कर सकते हैं और मेरा डिफ़ॉल्ट सेट प्राप्त कर सकते हैं जो आमतौर पर एक बार स्पष्ट प्रमुख छाया के साथ काफी जीवंत रंग उत्पन्न करेगा, या आप अपनी खुद की सरणी की आपूर्ति कर सकते हैं।


1
Google मानचित्र API "#FFFFFF" प्रारूप में केवल हेक्साडेसिमल HTML रंग का समर्थन करता है।
वालेरी विक्टोरोव्स्की

निश्चित रूप से, एक नंबर को हेक्स n.toString (16) में बदलने के लिए बहुत ही सरल है, केवल यह सुनिश्चित करने के लिए कि आपको आंतरिक जी फ़ंक्शन से दो वर्ण वापसी मान प्राप्त करने के लिए शून्य पैड की आवश्यकता होगी।
ओली एडवर्ड्स

8

शीर्ष उत्तर के शीर्ष मतदान टिप्पणी से पता चलता है कि मार्टिन एंकल का दृष्टिकोण यादृच्छिक हेक्स संख्या की तुलना में बेहतर है, और हालांकि मैंने एंकर की कार्यप्रणाली में सुधार नहीं किया है, मैंने सफलतापूर्वक इसे जावास्क्रिप्ट में अनुवादित किया है। मुझे लगा कि मैं इस पहले से ही मेगा-आकार वाले एसओ धागे के लिए एक अतिरिक्त उत्तर पोस्ट करूंगा क्योंकि शीर्ष उत्तर में एक और टिप्पणी है जो एंकर के तर्क को जेएस कार्यान्वयन के साथ जोड़ रहा है और वह लिंक टूटा हुआ है (404)। अगर मेरे पास प्रतिष्ठा होती, तो मैंने बस मेरे द्वारा बनाए गए jsbin लिंक पर टिप्पणी की होती।

// 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

सभ्य यादृच्छिकता के लिए।

यादृच्छिक रंग

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

यादृच्छिक अल्फा, यादृच्छिक रंग।

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

7

ऐसे कई तरीके हैं जिनसे आप इसे पूरा कर सकते हैं। यहाँ कुछ मैंने किया है:

छह यादृच्छिक हेक्स अंक (0-F) उत्पन्न करता है

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

बहुत कम एक लाइनर

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

व्यक्तिगत हेक्स घटक (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;
}

अधिक इंजीनियर हेक्स स्ट्रिंग (XORs 3 आउटपुट मिलकर रंग बनाते हैं)

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

एक्सट्रीम शॉर वन-लाइनर: जब रैंडम रिटर्न होता है 0.125तो परिणाम #0.2(अमान्य रंग)
कामिल कील्वेज़्स्की

@ KamilKiełczewski 0.125= 3FC0000000000000IEEE हेक्स में। 3 हेक्स अंक घातांक हैं, 13 मंटिसा हैं। वहाँ एक 1 में है 4.5 quadrillion मौका है कि mantissa की तरह पूरी तरह से खाली है। मैंने फ़ायरफ़ॉक्स / क्रोम दोनों में 100 मी बार परीक्षण किया। आप इसे तोड़ने की कोशिश कर रहे हैं ;)। आपको कभी भी 0.125 नहीं देना Math.randomचाहिए । और अगर ऐसा होता है, तो PRNG के साथ एक समस्या है, जो मेरी समस्या नहीं है। 0.5, 0.25, 0.0625 आदि जैसे अंश बेकार हैं, उनमें कोई यादृच्छिकता नहीं है। शायद आपके पास इस चरम बढ़त मामले का हल है, एचएम? ;)
bryc

हाँ '#'+Math.random().toString(16).split('.')[1].slice(-6).padStart(6,0), लेकिन मैं पसंद करते हैं इस
कामिल Kiełczewski

6

अभी तक एक और यादृच्छिक रंग जनरेटर:

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 यह बहुत साफ करता है।

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

पुराने ब्राउज़रों के लिए एक शिम चाहिए।


क्रोम कंसोल में, सभी
रास्ते

6

आप इस सरल फ़ंक्शन का उपयोग कर सकते हैं

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

1
जब यादृच्छिक रिटर्न 0.001परिणाम "#4189"(अमान्य रंग 4 अंक) है
कामिल Kiełczewski


5

अलग-अलग रंगों का प्रयोग करें

यह नेत्रहीन एक पैलेट उत्पन्न करता है अलग-अलग रंगों ।

अलग-अलग रंग अत्यधिक विन्यास योग्य हैं:

  • चुनें कि पैलेट में कितने रंग हैं
  • एक विशिष्ट सीमा तक रंग को प्रतिबंधित करें
  • क्रोमा (संतृप्ति) को एक विशिष्ट सीमा तक सीमित करें
  • एक विशिष्ट सीमा तक लपट को प्रतिबंधित करें
  • पैलेट की सामान्य गुणवत्ता कॉन्फ़िगर करें

कोड की 3541 लाइनें..जहां अन्य उत्तर हैं ~ 6-10 लाइनें ... मैं प्रभावित हूं कि किसी ने कोड की इतनी सारी पंक्तियां कैसे लिखीं बस अलग रंग लेने के लिए ..
vsync

वास्तव में नेत्रहीन अलग-अलग रंगों को चुनने से बस यादृच्छिक रंग जनरेटर की तुलना में बहुत अधिक गणित की आवश्यकता होती है।
आंतरिक

मैंने अभी इसे 2 लाइनों में किया है .. इस फ़ंक्शन को संशोधित किया: stackoverflow.com/a/20129594/104380
vsync

यह इतना आसान नहीं है। सुझाव दिया गया पढ़ने
आंतरिक

धन्यवाद, बहुत ही रोचक लेख। मेरी विधि हमेशा समान रंग प्रदान करती है, और परिणाम सुसंगत और विशिष्ट होते हैं। मुझे लगता है कि कुछ स्थितियों में आपको वास्तव में यादृच्छिक, अच्छी तरह से वितरित रंगों की आवश्यकता हो सकती है जो मानव आंखों के लिए सुंदर हैं।
vsync

3

यहाँ एक यादृच्छिक हेक्स कोड जनरेटर के लिए मेरे दो संस्करण हैं।


/* 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

यह फ़ंक्शन दो तरीकों से अन्य उत्तरों से ऊपर और परे जाता है:

यह संभव के रूप में अलग-अलग रंगों को उत्पन्न करने का प्रयास करता है, 20 में से कौन सा रंग एचएसवी शंकु में अन्य से सबसे दूर यूक्लिडियन दूरी है

यह आपको रंग, संतृप्ति या मूल्य सीमा को प्रतिबंधित करने की अनुमति देता है, लेकिन फिर भी उस सीमा के भीतर रंगों को यथासंभव अलग-अलग लेने का प्रयास करता है।

यह सुपर कुशल नहीं है, लेकिन उचित मूल्यों के लिए (जो आसानी से 100 रंगों को अलग कर सकते हैं?) यह काफी तेजी से है।

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

पिछले सभी शॉर्ट हैंड तरीकों में से लगभग सभी अमान्य हेक्स कोड (पांच अंक) उत्पन्न कर रहे हैं। मैं केवल कि इस मुद्दे के बिना एक समान तकनीक में आए यहाँ :

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

परीक्षा

कंसोल में यह प्रयास करें:

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

4
मैंने एक फॉर-लूप बनाया जो इस कोड को 20000 बार चलाता था और केवल कंसोल पर मुद्रित होता था यदि लंबाई 7 से कम थी, और मुझे एक मामला मिला जिसमें स्ट्रिंग 6 वर्णों से कम था। साथ ही, इस कोड के साथ एक समस्या यह है कि यह केवल पूरे 6-अंकीय स्ट्रिंग को नहीं, बल्कि व्यक्तिगत 2-अंकीय रंग कोड को भी पैड करता है, जिसका अर्थ है कि आप हरे या नीले मूल्यों की तुलना में लाल मूल्य में शून्य होने की अधिक संभावना रखते हैं।
एरिन हेमिंग

जब 0.00001परिणाम वापस आ जाता है "#000a7"(अमान्य रंग - 5 अंक)
कामिल कील्वेज़ेस्की

3

मेरा संस्करण:

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

मुझे लगता है 0random
नॉट

हम रैंडली से एक हेक्साडेसिनल संख्या उत्पन्न 0करते हैं ffffff। जो एक पूर्ण समान वितरण है । वह शून्य केवल स्ट्रिंग को पूरा करने के लिए है, क्योंकि ब्राउज़र उपयोग के विचारों के कारण। मेरा सुझाव है कि आप इस समाधान पर अधिक सावधान रहें।
प्रोस्टाकोव

मैंने कुछ समायोजन किए हैं, हालांकि आपकी टिप्पणी से जुड़ा नहीं है :)
प्रोस्टाकोव

धन्यवाद Prostakov। : D
shrekuu

3

नक्शा (हमेशा वैध आरजीबी रंग देता है)

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


2

आप अलग अलग रंग के साथ रंगों का एक क्रम उत्पन्न करने के लिए colorchain.js का उपयोग कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.