เครื่องกำเนิดไฟฟ้าสีแบบสุ่ม


440

ด้วยฟังก์ชั่นนี้ฉันต้องการแทนที่สีด้วยเครื่องกำเนิดสีแบบสุ่ม

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

ฉันจะทำมันได้อย่างไร


31
'#' + Math.Floor (Math.random () * 16777215) .ToString (16);
SepehrM


2
@SepehrM เมื่อผลตอบแทนแบบสุ่ม0.001แล้วผลลัพธ์คือ"#4189"(สีไม่ถูกต้อง - 4 หลัก)
Kamil Kiełczewski

นี่เป็นทางออกที่ดีมากสำหรับฉันที่มีประโยชน์มากgithub.com/davidmerfield/randomColor
maikelm

5
'#'+Math.random().toString(16).substr(2,6) (ที่มา: CodeGolf )
ashleedawg

คำตอบ:


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
โปรดทราบว่านี่มีอคติต่อสีที่ค่อนข้างมืดและไม่อิ่มตัวเนื่องจากวิธีที่ RGB ล้อมพื้นที่สี Martin Ankerl มีบทความที่ดีเกี่ยวกับการสร้างสีจากช่องว่างอื่น ๆ (เช่น HSV) เช่นกัน: martin.ankerl.com/2009/12/09/…
โธมัส Ahle

13
โอกาสในการกดปุ่ม 0 หรือ 15 เมื่อใช้งานMath.round(Math.random()*15)มีเพียง 1:30 ในขณะที่หมายเลขอื่น ๆ มีโอกาส 1:15
user123444555621

3
คุณสามารถลบการโทร. split ('') สายอักขระมีตัวทำดัชนีอาร์เรย์แล้ว
ujeenator

3
คุณสามารถใช้ฟังก์ชั่นสร้างเป็นเช่นนี้ได้
tsuz

5
รหัสนี้เป็นง่อย Heres an oniner: Math.floor (Math.random () * 16777215) .toString (16)
DDD

269

ฉันสงสัยว่าอะไรจะเร็วหรือสั้นกว่าอันนี้:

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

ท้าทาย!


18
คุณลืมที่จะเสริมด้วยศูนย์
123444555621

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

15
@Mohsen, FYI ทุกขณะนี้แล้วรหัสของคุณผลิตที่ไม่ถูกต้องจำนวน 5 หลัก
rochal

6
ผลลัพธ์ไม่ได้เป็นเบาะถึง 6 หลัก
Taha Jahangir

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
ฉันกำลังมองหาบางอย่างเช่นนี้! สิ่งที่ยอดเยี่ยม!
Khôi

ฉันได้ทำให้การใช้งานง่ายขึ้นของแนวคิดเดียวกันกับคำตอบของคำถามที่คล้ายกันstackoverflow.com/a/14187677/421010
Andrew

16
ดังนั้นสิ่งที่จะเป็นค่าพารามิเตอร์
Ekramul Hoque

2
ฉันยังสร้างบางอย่างเช่นนี้ แต่มันค่อนข้างสุ่มและค่อนข้างชัดเจน หลอกรหัสคือที่นี่ มันใช้ hsv แทน rgb เพราะ hsv มีพฤติกรรมที่คาดเดาได้มากกว่า หากคุณสนใจที่จะเห็นการดำเนินการหลามฉันใช้มันที่นี่และที่นี่ คุณจะต้องค้นหารหัสสำหรับ "สี"
zondo

1
@RobertMolina: ขออภัยฉันย้ายข้อมูลของฉันไปที่ Gitlab หลอกรหัสคือตอนนี้ที่นี่มีโครงการที่นี่และที่นี่
zondo

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' ที่ไม่ถูกต้อง บ้า!
rochal

เช่นนี้เนื่องจาก #ffffff ไม่ปรากฏบ่อยเกินไป
Warface

มีเหตุการณ์เกิดขึ้นค่อนข้างน้อยซึ่งสิ่งนี้จะไม่ทำงาน ตรวจสอบผลลัพธ์ต่อไปนี้สำหรับ Math.random () ... 0.730224609375, 0.43603515625, 0.957763671875 และรายการดำเนินการต่อไป ...
eterps

@eterps เหล่านั้นไม่ใช่ตัวเลขสุ่มที่เหมาะสม ! ดูดิบ IEEE 754 0.730224609375 = 0x3fe75e0000000000, 0.43603515625 = 0x3fdbe80000000000, 0.957763671875 = 0x3feea60000000000คู่ในฐานสิบหก: แทบจะไม่ได้ใช้ mantissa ใด ๆ ! มันเป็นแค่เศษส่วนที่ถวายเกียรติ เหมาะสม '12 บาท' เอาท์พุทจะก่อให้เกิดผลเช่น:0.347876714234 = 0x3fd6439cb1ab32ac, 0.447556256665 = 0x3fdca4c2ff5fc450
bryc

ตั้งแต่ปี 2015 ฉันเชื่อว่าเว็บเบราว์เซอร์จำนวนมากได้แทนที่ PRNG ที่เส็งเคร็งซึ่งใช้ภายใต้ประทุนMath.random()(ซึ่งฉันต้องถือว่ารับผิดชอบผลการค้นหาของ @ etertp) ด้วยอันดับที่ดีกว่าดังนั้นตัวเลขสุ่มคุณภาพต่ำเหล่านั้นควรเป็นสิ่งที่ผ่านมา ตอนนี้
bryc

29

ไม่จำเป็นต้องแฮชของตัวอักษรเลขฐานสิบหก JavaScript สามารถทำได้ด้วยตัวเอง:

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

นอกจากนี้คุณยังสามารถใช้ HSL ได้ในทุกเบราว์เซอร์ที่ดี ( 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
ไม่มี prob ฉันรู้สึกประหลาดใจที่จะเห็นไม่มีใครใช้อำนาจของ HSL :) ความ
kigiri

stackoverflow.com/a/23861752/1693593 hsla ไม่จำเป็นต้องใช้มัน alpha = 1 เพียงใช้ hsl

1
คุณไม่สามารถสร้าง 16M kolor ด้วยวิธีนี้ (เช่นคุณจะไม่ได้รับสีเทาขาวดำ) - แต่ก็ใช่ - ถ้าเราใช้การสุ่มแต่ละองค์ประกอบเราจะได้ hsl corols ทั้งหมด
Kamil Kiełczewski

1
+1 สิ่งนี้ทำให้ง่ายขึ้นในการใช้ความสว่างและความอิ่มตัวของสีเพื่อตั้งค่าสีพื้นหลังแบบสุ่มในขณะที่มั่นใจได้ว่าข้อความสามารถอ่านได้เสมอ
Osvaldo Maria

27

ฉันชอบอันนี้: '#' + (Math.random().toString(16) + "000000").substring(2,8)


หรือ'#' + Math.floor(Math.random()*16777215).toString(16);
โมฮัมหมัด Anini

@MohammadAnin ที่มีโอกาส 1 ใน 16 ของการผลิตน้อยกว่า 6 หลัก
James

1
สิ่งนี้อาจสร้างสีที่ไม่ถูกต้อง '#' + (0.125).toString(16).substring(2, 8) === '#2'เช่น มันเป็นอันตรายเพราะความน่าจะเป็นต่ำ (1 ใน 4096 ฉันคิดว่า) ดังนั้นข้อผิดพลาดน่าจะผ่านการทดสอบ คุณควร ('#' + Math.random().toString(16) + "000000").substring(2, 8)
James

การแก้ไข: ควรเป็น'#' + (Math.random().toString(16) + "000000").substring(2,8)
James

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

ฉันชอบอันนี้มากเพราะคุณสามารถปรับแต่งมันให้สอดคล้องกับจานสีของเว็บไซต์ของคุณได้
Emanuel Gianico

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(สีไม่ถูกต้อง) (คุณต้องเพิ่มการเติมบางส่วนแทนชิ้น)
Kamil Kiełczewski

18

บทความที่เขียนโดยPaul Irishในการสร้างรหัสสี Hex แบบสุ่มใน JavaScript นั้นยอดเยี่ยมมาก ใช้:

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

นี่คือลิงค์ที่มา:

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


5
บางครั้งจะส่งคืนค่าสีที่ไม่ใช่รูปแบบที่ดีเช่น "1fa4c" (ต้องมี 3 หรือ 6 ตัวอักษร)
jj_

1
@jj_ ใช่หรือไม่ ขอโทษฉันไม่ได้สังเกตว่า ขอบคุณสำหรับการแบ่งปัน
way2vin

เมื่อการส่งคืนแบบสุ่ม0.00001ผลลัพธ์ก็คือ#a7(สีไม่ถูกต้อง)
Kamil Kiełczewski

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

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

ฉันคิดว่านี่น่าจะผลิตสีที่มักจะคล้ายกันมากแม้ว่าแสง สำหรับสีที่กระจัดกระจายมากขึ้นฉันคิดว่าการตอบสนองของ @ Anatoli ดีกว่าสำหรับส่วนใหญ่
larrytech

15

หากคุณเป็นคนที่ไม่ชอบฉัน clueless เกี่ยวกับเลขฐานสิบหกและเช่นนี้อาจจะง่ายขึ้น

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

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

คุณเพียงแค่ต้องจบลงด้วยสตริงเช่น 'rgb(255, 123, 220)'


คำตอบนี้จะต้องเป็นอันดับหนึ่ง
Gil Epshtain

คุณต้องใช้ 256 เพื่อให้ได้ 0
Lisa Cerilli

13

สามารถพบได้ง่ายมากโดยใช้ Google Search:

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 Adwords-Income เป็นไปได้ =)
เดวิดบอกว่าคืนสถานะโมนิก้า

2
เว็บไซต์ไหนที่ให้คำตอบกับคุณ หากพวกเขาให้คำตอบกับคุณพวกเขาควรได้รับความนิยม
Dude ขี้ขลาด

1
@FunkyDude ตอนนี้ผลลัพธ์นี้เป็นตัวที่ติดอันดับบน google และเหตุผลที่ stackoverflow มีอยู่คือไม่ใช้ google บ่อยเกินไป;)
Akshat


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

รายละเอียดของการทำงาน:

Math.random()*256รับตัวเลขสุ่ม (ทศนิยม) จาก 0 ถึง 256 (รวม 0 ถึง 255)
ตัวอย่างผลลัพธ์: 116.15200161933899

การเพิ่ม|0แถบปิดทุกอย่างหลังจุดทศนิยม
เช่น 116.15200161933899 -> 116

การใช้.toString(16)แปลงตัวเลขนี้เป็นเลขฐานสิบหก (ฐาน 16)
เช่น 116 -> 74
อีกตัวอย่าง: 228 -> e4

เพิ่ม"0"แผ่นมันด้วยศูนย์ สิ่งนี้จะสำคัญเมื่อเราได้รับสตริงย่อยเนื่องจากผลลัพธ์สุดท้ายของเราจะต้องมีอักขระสองตัวสำหรับแต่ละสี
ตัวอย่าง: 74 -> 074
อีกตัวอย่าง: 8 -> 08

.substr(-2)รับอักขระสองตัวสุดท้ายเท่านั้น
ตัวอย่าง: 074 -> 74
อีกตัวอย่าง: 08 -> 08 (ถ้าเราไม่ได้เพิ่ม"0"นี้จะสร้าง "8" แทนที่จะเป็น "08")

forห่วงวิ่งวนรอบนี้สามครั้งเพิ่มผลแต่ละสตริงสี, การผลิตบางอย่างเช่นนี้
#7408e4


คุณควรจะตอบคำถามของคุณ
joce

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 ช่วงโดยพลการเพื่อเลือกค่า rgb จาก คุณสามารถเรียกมันได้โดยไม่มีข้อโต้แย้งและตั้งค่าเริ่มต้นของฉันซึ่งโดยปกติจะสร้างสีที่สดใสด้วยเฉดสีที่เด่นชัดเพียงครั้งเดียวหรือคุณสามารถจัดหาช่วงของคุณเอง


1
Google Map API รองรับเฉพาะสี HTML แบบเลขฐานสิบหกในรูปแบบ "#FFFFFF"
Valery Viktorovsky

แน่นอนว่าค่อนข้างตรงไปตรงมาในการแปลงตัวเลขเป็นฐานสิบหก n.toString (16) มีเพียงอุปสรรค์เท่านั้นที่คุณจะต้องมี zero pad เพื่อให้แน่ใจว่าคุณได้รับค่าส่งคืนอักขระสองตัวจากฟังก์ชัน Inner g
โอลลี่เอ็ดเวิร์ด

8

ความคิดเห็นที่ได้รับการโหวตสูงสุดของคำตอบยอดนิยมแสดงให้เห็นว่าวิธีการของ Martin Ankerl นั้นดีกว่าเลขฐานสิบหกแบบสุ่มและแม้ว่าฉันจะไม่ได้ปรับปรุงวิธีการของ Ankerl แต่ฉันก็แปลมันเป็น JavaScript ได้สำเร็จ ฉันคิดว่าฉันโพสต์คำตอบเพิ่มเติมสำหรับหัวข้อ SO ขนาดใหญ่นี้อยู่แล้วเพราะคำตอบยอดนิยมมีความคิดเห็นอื่นที่เชื่อมโยงไปยังส่วนสำคัญที่มีการใช้ JS ของตรรกะของ Ankerl และลิงก์นั้นเสีย (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)

สร้างแต่ละส่วนประกอบ HEX (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);
}

extremley shor หนึ่งซับ: เมื่อผลตอบแทนที่สุ่ม0.125แล้วส่งผลให้เป็น#0.2(สีไม่ถูกต้อง)
Kamil Kiełczewski

@ KamilKiełczewski 0.125= 3FC0000000000000ในฐานสิบหก IEEE เลขฐานสิบหก 3 เลขชี้กำลังเป็นเลขฐานสิบหกและ 13 เลขหน่วยเป็น mantissa มีโอกาส1 ใน 4.5 ล้านล้านที่ mantissa นั้นว่างเปล่าอย่างนั้น ฉันทดสอบ 100m ครั้งทั้งใน Firefox / Chrome คุณกำลังพยายามทำลายมัน;) ไม่Math.randomควรให้คุณ 0.125 และถ้าเป็นเช่นนั้นแสดงว่ามีปัญหากับ PRNG ซึ่งไม่ใช่ปัญหาของฉัน เศษส่วนเช่น 0.5, 0.25, 0.0625 เป็นต้นนั้นไร้ประโยชน์พวกมันไม่มีการสุ่ม บางทีคุณอาจมีวิธีแก้ปัญหากรณีที่รุนแรงอย่างนี้หืมมม? ;)
bryc

ใช่'#'+Math.random().toString(16).split('.')[1].slice(-6).padStart(6,0)แต่ฉันชอบสิ่งนี้
Kamil 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)
}, "#")

ต้องการ shim สำหรับเบราว์เซอร์รุ่นเก่า


ในคอนโซลโครเมี่ยม allways กลับ # 000000
Kamil Kiełczewski

6

คุณสามารถใช้ฟังก์ชั่นง่าย ๆ นี้ได้

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

1
เมื่อการสุ่มส่งคืน0.001ผลลัพธ์คือ"#4189"(สีไม่ถูกต้อง 4 หลัก)
Kamil Kiełczewski


5

ใช้สีที่แตกต่างที่แตกต่างกันสี

มันสร้างจานสีของภาพแตกต่าง

สีที่แตกต่างสามารถกำหนดค่าได้สูง:

  • เลือกจำนวนสีที่อยู่ในจานสี
  • จำกัด เว้ไปยังช่วงที่ระบุ
  • จำกัด ความเข้มของสี (ความอิ่มตัว) ให้อยู่ในช่วงที่ระบุ
  • จำกัด ความสว่างให้อยู่ในช่วงที่ระบุ
  • กำหนดค่าคุณภาพทั่วไปของพาเล็ต

3541 บรรทัดของรหัส .. คำตอบอื่น ๆ ที่นี่อยู่ที่ ~ 6-10 บรรทัด ... ฉันประทับใจที่มีคนเขียนโค้ดหลายบรรทัดเพื่อเลือกสีที่แตกต่าง ..
vsync

การเลือกสีที่แตกต่างอย่างเห็นได้ชัดต้องใช้คณิตศาสตร์มากกว่าตัวสร้างสีแบบสุ่ม
InternalFX

ฉันเพิ่งทำใน 2 บรรทัด .. ปรับเปลี่ยนฟังก์ชั่นนี้: stackoverflow.com/a/20129594/104380
vsync

มันไม่ง่ายอย่างนั้น การอ่านที่แนะนำ
InternalFX

ขอบคุณบทความที่น่าสนใจมาก วิธีการของฉันให้สีเหมือนกันเสมอและผลลัพธ์มีความสอดคล้องและโดดเด่น ฉันเดาว่าในบางสถานการณ์คุณอาจต้องใช้สีแบบสุ่มที่มีการกระจายที่ดีซึ่งค่อนข้างน่าสนใจต่อสายตามนุษย์
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 ครั้งที่มีระยะทาง euclidian ที่ไกลที่สุดจากสีอื่น ๆ ในกรวย HSV

ช่วยให้คุณสามารถ จำกัด ช่วงสีความอิ่มตัวหรือค่า แต่ยังคงพยายามเลือกสีที่แตกต่างกันมากที่สุดในช่วงนั้น

มันไม่ได้มีประสิทธิภาพมากนัก แต่สำหรับค่าที่สมเหตุสมผล (ใครจะเลือกได้ 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
ฉันทำ for-loop ที่รันโค้ดนี้ 20,000 ครั้งและพิมพ์ไปที่คอนโซลเท่านั้นหากความยาวน้อยกว่า 7 และฉันพบกรณีที่สตริงมีอักขระน้อยกว่า 6 ตัว นอกจากนี้ปัญหาอย่างหนึ่งของรหัสนี้ก็คือมันจะยึดสายอักขระ 6 หลักทั้งหมดไม่ใช่รหัสสี 2 หลักแต่ละตัวซึ่งหมายความว่าคุณมีแนวโน้มที่จะมีเลขศูนย์เป็นสีแดงมากกว่าค่าสีเขียวหรือสีน้ำเงิน
Erin Heyming

เมื่อการสุ่มส่งคืน0.00001ผลลัพธ์คือ"#000a7"(สีไม่ถูกต้อง - 5 หลัก)
Kamil Kiełczewski

3

รุ่นของฉัน:

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

ฉันคิดว่าการไม่สุ่ม0ทำให้สีไม่randomเพียงพอ XD
shrekuu

เรา randonly สร้างจำนวน hexadecinal จากไป0 ffffffซึ่งเป็นที่สมบูรณ์แบบกระจายสม่ำเสมอ ศูนย์นั้นใช้เพื่อกรอกสตริงเท่านั้นเนื่องจากข้อควรพิจารณาในการใช้เบราว์เซอร์ ฉันขอแนะนำให้คุณดูอย่างระมัดระวังในโซลูชันนี้
Prostakov

ฉันได้ทำการปรับเปลี่ยนไม่กี่ แต่ไม่เชื่อมโยงกับความคิดเห็นของคุณ :)
Prostakov

ขอบคุณ Prostakov : D
shrekuu


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.