Trình tạo màu ngẫu nhiên


440

Với chức năng này, tôi muốn thay thế màu bằng một trình tạo màu ngẫu nhiên.

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

Tôi làm nó như thế nào?


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


2
@SepehrM khi trả về ngẫu nhiên 0.001thì kết quả là "#4189"(màu không hợp lệ - 4 chữ số)
Kamil Kiełczewski

Đây là một giải pháp rất hay, đối với tôi rất hữu ích github.com/davidmerfield/randomColor
maikelm

5
'#'+Math.random().toString(16).substr(2,6) (nguồn: CodeGolf )
ashleedawg

Câu trả lời:


1018

Sử dụng getRandomColor()thay cho "#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
Lưu ý rằng điều này có xu hướng đối với các màu khá tối và không bão hòa do cách RGB bao bọc không gian màu. Martin Ankerl cũng có một bài viết hay về cách tạo màu từ các không gian khác (như HSV): martin.ankerl.com/2009/12/09/ chủ
Thomas Ahle

13
Cơ hội đạt 0 hoặc 15 khi sử dụng Math.round(Math.random()*15)chỉ là 1:30, trong khi cơ hội của các số khác là 1:15.
dùng123444555621

3
Bạn có thể xóa cuộc gọi .split (''). Chuỗi đã có Array indexer.
ujeenator

3
Bạn cũng có thể sử dụng Chức năng tạo như vậy
tsuz

4
Mã này là khập khiễng. Đây là một oneliner: Math.floor (Math.random () * 16777215) .toString (16)
DDD

269

Tôi nghi ngờ bất cứ điều gì sẽ nhanh hơn hoặc ngắn hơn cái này:

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

Thử thách!


18
Bạn đã quên đệm với số không.
user123444555621

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

15
@Mohsen, FYI cứ sau đó và mã của bạn tạo ra số 5 chữ số không hợp lệ
rochal

6
Kết quả không được đệm thành 6 chữ số
Taha Jahangir

33
('00000'+(Math.random()*(1<<24)|0).toString(16)).slice(-6)sẽ luôn trả về độ dài là 6. mặc dù phương pháp này vẫn sẽ (hiếm khi) trả về các số nhỏ mang lại kết quả như thế 000cf4hoặc 0000a7hơi khó tin tôi nghĩ. trong những trường hợp này, thành phần màu đỏ không đóng góp vào màu ngẫu nhiên.
bryc

162

Đây là một vấn đề khác về vấn đề này.

Mục tiêu của tôi là tạo ra màu sắc rực rỡ và khác biệt. Để đảm bảo màu sắc khác biệt, tôi tránh sử dụng một trình tạo ngẫu nhiên và chọn các màu "cách đều nhau" từ cầu vồng.

Điều này là hoàn hảo để tạo các điểm đánh dấu bật ra trong Google Maps có "tính duy nhất" tối ưu (nghĩa là không có hai điểm đánh dấu nào có màu tương tự nhau).

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

Nếu bạn muốn xem những gì nó trông như thế nào trong hành động, xem http://blog.adamcole.ca/2011/11/simple-javascript-rainbow-color.html .


7
Tôi đã tìm kiếm một cái gì đó như thế này! Công cụ tuyệt vời!
Khôi

Tôi đã thực hiện đơn giản hóa ý tưởng tương tự như câu trả lời cho câu hỏi tương tự stackoverflow.com/a/14187677/421010
Andrew

15
Vì vậy, giá trị của tham số là gì?
Ekramul Hoque

2
Tôi cũng đã tạo ra một cái gì đó như thế này, nhưng nó khá ngẫu nhiên và khá khác biệt. Mã giả ở đây . Nó sử dụng hsv chứ không phải rgb, vì hsv có hành vi dễ dự đoán hơn nhiều. Nếu bạn quan tâm để xem triển khai Python, tôi đã sử dụng nó ở đâyđây . Bạn sẽ phải tìm kiếm thông qua mã cho "màu".
zondo

1
@RobertMolina: Xin lỗi, tôi đã chuyển công cụ của mình sang Gitlab. Mã giả bây giờ ở đây , với các dự án ở đâyở đây .
zondo

56

Ai có thể đánh bại nó?

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

Đảm bảo làm việc mọi lúc: http://jsbin.com/OjELIfo/2/edit

Dựa trên nhận xét @eterps, đoạn mã trên vẫn có thể tạo các chuỗi ngắn hơn nếu biểu diễn thập lục phân của màu ngẫu nhiên rất ngắn ( 0.730224609375=> 0.baf)

Mã này sẽ hoạt động trong mọi trường hợp:

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

12
Khi Math.random () trả về 0,022092682472568126 mã này tạo ra chuỗi '# 5a7dd' không hợp lệ. khùng!
rochal

Giống như cái này vì #ffffff không xuất hiện quá thường xuyên.
Warface

Có một vài sự cố mà điều này sẽ không hoạt động. Kiểm tra kết quả đầu ra sau đây cho Math.random () ... 0.730224609375, 0.43603515625, 0.957763671875 và danh sách tiếp tục ...
eterps

@eterps Đó không phảisố ngẫu nhiên thích hợp ! Xem đôi IEEE 754 thô trong hex : 0.730224609375 = 0x3fe75e0000000000, 0.43603515625 = 0x3fdbe80000000000, 0.957763671875 = 0x3feea60000000000. Hầu như không có mantissa đang được sử dụng! Họ chỉ là những phân số được tôn vinh. Một đầu ra '12 chữ số ' thích hợp sẽ tạo ra kết quả như:0.347876714234 = 0x3fd6439cb1ab32ac, 0.447556256665 = 0x3fdca4c2ff5fc450
bryc

Kể từ năm 2015, tôi tin rằng nhiều trình duyệt web đã thay thế các PRNG xảo quyệt được sử dụng trong chương trình Math.random()(mà tôi phải giả sử là chịu trách nhiệm về kết quả của @ etertp) bằng các loại số ngẫu nhiên chất lượng thấp nên là quá khứ hiện nay.
bryc

29

Không cần băm các chữ cái thập lục phân. JavaScript có thể tự làm điều này:

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

Bạn cũng có thể sử dụng HSL có sẵn trên mọi trình duyệt tốt ( http://caniuse.com/#feat=css3-colors )

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

Điều này sẽ chỉ cung cấp cho bạn các màu sáng, bạn có thể chơi xung quanh với độ sáng, độ bão hòa và alpha.

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

Cảm ơn! Tôi đã quản lý để có được màu sắc hoàn hảo cho nền với:'hsla(' + (Math.floor(Math.random()*360) + ', 100%, 70%, 1)'
jj_

1
Không có thăm dò, tôi đã ngạc nhiên khi thấy không có ai sử dụng sức mạnh của hsl :)
kigiri

stackoverflow.com/a/23861752/1693593 , hsla không cần nó alpha = 1, chỉ cần sử dụng hsl

1
Bạn không thể tạo 16M kolor theo cách này (ví dụ: bạn sẽ không bao giờ có màu xám đen) - tuy nhiên có - nếu chúng tôi sử dụng ngẫu nhiên cho mỗi thành phần thì chúng tôi sẽ nhận được tất cả các corols
Kamil Kiełczewski 21/03/19

1
+1 Điều này giúp dễ dàng sử dụng độ sáng và độ bão hòa để đặt màu nền ngẫu nhiên trong khi đảm bảo rằng văn bản luôn có thể đọc được
Osvaldo Maria

27

Tôi thích cái này: '#' + (Math.random().toString(16) + "000000").substring(2,8)


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

@MohammadAnin có 1 trong 16 cơ hội sản xuất dưới 6 chữ số
James

1
Điều này có thể tạo ra màu sắc không hợp lệ. Ví dụ '#' + (0.125).toString(16).substring(2, 8) === '#2'. Điều này rất nguy hiểm vì xác suất thấp (tôi nghĩ là 1 trong 4096) nên một lỗi có thể xảy ra thông qua thử nghiệm. Bạn nên ('#' + Math.random().toString(16) + "000000").substring(2, 8)
James

Sửa chữa: nên là'#' + (Math.random().toString(16) + "000000").substring(2,8)
James

25

Tạo màu ngẫu nhiên với điều khiển độ sáng:

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
Rất tuyệt, mặc dù chủ yếu tạo ra 'phấn màu' thay vì màu sắc rực rỡ hơn mà tôi đã hy vọng khi nhìn thấy độ sáng. Vẫn đi vào túi thủ đoạn của tôi!
JayCrossler

Tôi thực sự thích cái này vì bạn có thể tùy chỉnh nó để hài hòa với bảng màu trang web của bạn
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

Tôi thích điều này vì tính dễ đọc của nó
hitautodesturation

1
nếu Math.random()trả về 0.125thì kết quả sẽ là #0.2(màu không hợp lệ) (bạn cần thêm một số phần đệm thay vì lát)
Kamil Kiełczewski

18

Bài viết được viết bởi Paul Irish trên Random Hex Color Code Generator trong JavaScript là hoàn toàn tuyệt vời. Sử dụng:

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

Đây là liên kết nguồn:

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


5
đôi khi điều này sẽ trả về các giá trị màu không được định dạng tốt như "1fa4c" (cần có 3 hoặc 6 ký tự)
jj_

1
@jj_ phải không? xin lỗi tôi đã không nhận thấy điều đó Cảm ơn bạn đã chia sẻ
way2vin

khi trả về ngẫu nhiên 0.00001thì kết quả là #a7(màu không hợp lệ)
Kamil Kiełczewski

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

17

Đây là một thay đổi về giải pháp được cung cấp bởi @Anatoliy.

Tôi chỉ cần tạo các màu sáng (cho nền), vì vậy tôi đã sử dụng định dạng ba chữ cái (#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;
}

Tôi nghĩ rằng điều này có khả năng tạo ra hầu hết các màu sắc gần giống nhau mặc dù ánh sáng. Đối với dải màu ngẫu nhiên thưa thớt hơn, tôi nghĩ rằng phản ứng của @ Anatoli tốt hơn đối với hầu hết các phần
larrytech

15

Nếu bạn là một người không thích tôi, không biết gì về hexadecimals và như vậy, điều này có thể trực quan hơn.

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

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

Bạn chỉ cần kết thúc bằng một chuỗi như 'rgb(255, 123, 220)'


câu trả lời này cần phải là câu trả lời hàng đầu
Gil Epshtain

Bạn sẽ phải sử dụng 256 để nhận 0 mặc dù.
Lisa Cerilli

13

Điều này có thể rất dễ dàng được tìm thấy bằng 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;
    }
}

Phiên bản cập nhật:

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
Co le vậy; nhưng bạn muốn doanh thu Google Adwords có thể đến trang web nào? =)
David nói phục hồi Monica

2
trang web nào cung cấp cho bạn câu trả lời? nếu họ cung cấp cho bạn câu trả lời, họ sẽ nhận được các lượt truy cập.
Funky Dude

1
@FunkyDude bây giờ kết quả này là kết quả hàng đầu trên google và lý do stackoverflow tồn tại là không sử dụng google quá thường xuyên;)
Akshat

10

Câu trả lời ngắn với pad đến kích thước chính xác

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

Bảng phân tích về cách thức hoạt động của tính năng này:

Math.random()*256nhận được một số ngẫu nhiên (dấu phẩy động) từ 0 đến 256 (bao gồm 0 đến 255)
Kết quả ví dụ: 116.15200161933899

Thêm các |0dải tắt tất cả mọi thứ sau dấu thập phân.
Vd: 116.15200161933899 -> 116

Sử dụng .toString(16)chuyển đổi số này thành thập lục phân (cơ sở 16).
Vd: 116 -> 74
Một ví dụ khác: 228 -> e4

Thêm "0"miếng đệm với số không. Điều này sẽ rất quan trọng khi chúng ta có được chuỗi con, vì kết quả cuối cùng của chúng ta phải có hai ký tự cho mỗi màu.
Vd: 74 -> 074
Một ví dụ khác: 8 -> 08

.substr(-2)chỉ có hai nhân vật cuối cùng.
Ví dụ: 074 -> 74
Một ví dụ khác: 08 -> 08 (nếu chúng tôi không thêm "0", cái này sẽ tạo ra "8" thay vì "08")

Các forvòng lặp chạy vòng lặp này ba lần, thêm mỗi kết quả vào chuỗi màu, sản xuất cái gì đó như thế này:
#7408e4


Bạn nên xác thịt trả lời.
joce

8

Vì vậy, trong khi tất cả các câu trả lời ở đây đều tốt, tôi muốn kiểm soát đầu ra nhiều hơn một chút. Chẳng hạn, tôi muốn ngăn chặn bất kỳ sắc thái gần màu trắng nào, trong khi đảm bảo tôi có được màu sắc rực rỡ không bị xóa nhòa.

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

Vì vậy, bây giờ tôi có thể chỉ định 3 phạm vi tùy ý để chọn giá trị rgb từ đó. Bạn có thể gọi nó mà không có đối số và lấy tập hợp mặc định của tôi, thứ thường sẽ tạo ra màu sắc khá rực rỡ với sắc thái chiếm ưu thế rõ ràng hoặc bạn có thể cung cấp mảng phạm vi của riêng mình.


1
API Google Map chỉ hỗ trợ màu HTML thập lục phân ở định dạng "#FFFFFF".
Valery Viktorovsky

Chắc chắn, khá đơn giản để chuyển đổi một số thành hex n.toString (16) chỉ cần snag là không cần pad để đảm bảo bạn nhận được giá trị trả về hai ký tự từ hàm g bên trong.
Ollie Edwards

8

Nhận xét được bình chọn hàng đầu của câu trả lời hàng đầu cho thấy cách tiếp cận của Martin Ankerl tốt hơn số hex ngẫu nhiên và mặc dù tôi đã không cải thiện phương pháp của Ankerl, tôi đã dịch thành công sang JavaScript. Tôi hình dung tôi sẽ đăng một câu trả lời bổ sung cho luồng SO có kích thước cực lớn này bởi vì câu trả lời hàng đầu có một nhận xét khác liên kết đến một Gist với việc triển khai JS của logic Ankerl và liên kết đó bị hỏng (404). Nếu tôi có danh tiếng, tôi sẽ chỉ nhận xét liên kết jsbin mà tôi đã tạo.

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

Đối với sự ngẫu nhiên phong nha.

Màu ngẫu nhiên

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

Alpha ngẫu nhiên, màu sắc ngẫu nhiên.

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

7

Có rất nhiều cách bạn có thể thực hiện điều này. Đây là một số tôi đã làm:

Tạo sáu chữ số hex ngẫu nhiên (0-F)

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

Một lớp lót cực ngắn

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

Tạo các thành phần HEX riêng lẻ (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;
}

Chuỗi hex được thiết kế quá mức (XOR 3 kết hợp với nhau để tạo thành màu)

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: khi 0.125kết quả ngẫu nhiên trở lại là #0.2(màu không hợp lệ)
Kamil Kiełczewski

@ KamilKiełczewski 0.125= 3FC0000000000000trong hex hex. 3 chữ số hex là số mũ, 13 là mantissa. Có một cơ hội 1 trong 4,5 triệu mà mantissa hoàn toàn trống rỗng như thế. Tôi đã thử nghiệm 100 triệu lần trong cả Firefox / Chrome. Bạn chỉ đang cố gắng để phá vỡ nó;). không bao giờMath.random nên cung cấp cho bạn 0,125. Và nếu có, có một vấn đề với PRNG, đó không phải là vấn đề của tôi. Các phân số như 0,5, 0,25, 0,0625, v.v ... là vô dụng, chúng không chứa tính ngẫu nhiên. Có lẽ bạn có một giải pháp cho trường hợp cực đoan này, hm? ;)
bryc

vâng '#'+Math.random().toString(16).split('.')[1].slice(-6).padStart(6,0)nhưng tôi thích điều này
Kamil Kiełczewski

6

Một trình tạo màu ngẫu nhiên khác:

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 làm cho nó rất sạch sẽ

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

Cần một shim cho các trình duyệt cũ.


trong giao diện điều khiển chrome luôn quay trở lại # 000000
Kamil Kiełczewski

6

Bạn có thể sử dụng chức năng đơn giản này

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

1
khi ngẫu nhiên trả về 0.001kết quả là "#4189"(4 chữ số màu không hợp lệ)
Kamil Kiełczewski


5

Sử dụng màu sắc riêng biệt .

Nó tạo ra một bảng màu màu sắc khác biệt trực quan .

màu sắc riêng biệt có cấu hình cao:

  • Chọn có bao nhiêu màu trong bảng màu
  • Hạn chế màu sắc trong một phạm vi cụ thể
  • Giới hạn sắc độ (độ bão hòa) trong một phạm vi cụ thể
  • Hạn chế độ sáng ở một phạm vi cụ thể
  • Cấu hình chất lượng chung của bảng màu

3541 dòng mã..tất cả các câu trả lời khác ở đây là ~ 6-10 dòng ... tôi rất ấn tượng về việc ai đó đã viết rất nhiều dòng mã chỉ để chọn màu khác biệt ..
vsync

Chọn màu sắc thực sự trực quan khác biệt đòi hỏi nhiều toán học hơn là chỉ một trình tạo màu ngẫu nhiên.
InternalFX

Tôi mới thực hiện trong 2 dòng .. đã sửa đổi chức năng này: stackoverflow.com/a/20129594/104380
vsync

Nó không đơn giản. đề nghị đọc
InternalFX

Cảm ơn, bài viết rất thú vị. phương pháp của tôi luôn cung cấp các màu giống nhau và kết quả là nhất quán và đặc biệt. Tôi đoán trong một số tình huống bạn có thể cần những màu sắc thực sự ngẫu nhiên, phân bố tốt, đẹp mắt.
vsync

3

Đây là hai phiên bản của tôi cho một trình tạo mã hex ngẫu nhiên.


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

Hàm này vượt lên trên và vượt ra ngoài các câu trả lời khác theo hai cách:

Nó cố gắng tạo ra các màu khác biệt nhất có thể bằng cách tìm màu nào trong số 20 lần thử có khoảng cách eidianidian xa nhất so với các màu khác trong hình nón HSV

Nó cho phép bạn hạn chế màu sắc, độ bão hòa hoặc phạm vi giá trị, nhưng vẫn cố gắng chọn màu sắc khác biệt nhất có thể trong phạm vi đó.

Nó không siêu hiệu quả, nhưng với các giá trị hợp lý (ai thậm chí có thể tách ra 100 màu một cách dễ dàng?) Nó đủ nhanh.

Xem 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

Hầu như tất cả các phương pháp tay ngắn trước đây đều tạo mã hex không hợp lệ (năm chữ số). Tôi đã bắt gặp một kỹ thuật tương tự chỉ khi không có vấn đề ở đây :

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

Kiểm tra

Hãy thử điều này trong bảng điều khiển:

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

4
Tôi đã tạo một vòng lặp for chạy mã này 20000 lần và chỉ được in ra bàn điều khiển nếu độ dài nhỏ hơn 7 và tôi đã tìm thấy một trường hợp chuỗi có ít hơn 6 ký tự. Ngoài ra, một vấn đề với mã này là nó chỉ đệm toàn bộ chuỗi 6 chữ số, không phải mã màu 2 chữ số riêng lẻ, điều đó có nghĩa là bạn có nhiều khả năng có các giá trị màu đỏ hơn trong các giá trị xanh lục hoặc xanh lam.
Erin Heyming

khi ngẫu nhiên trả về 0.00001kết quả là "#000a7"(màu không hợp lệ - 5 chữ số)
Kamil Kiełczewski

3

Phiên bản của tôi:

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

Tôi nghĩ rằng không ngẫu nhiên 0làm cho màu sắc không randomđủ XD
shrekuu

Chúng tôi randonly tạo ra một số thập lục phân từ 0đến ffffff. Đó là một phân phối đồng phục hoàn hảo . Số không đó chỉ là để hoàn thành chuỗi, vì những cân nhắc sử dụng trình duyệt. Tôi đề nghị bạn xem xét cẩn thận hơn về giải pháp này.
Prostakov

Tôi đã thực hiện một vài điều chỉnh mặc dù, không liên kết với nhận xét của bạn :)
Prostakov

Cảm ơn Prostakov. : D
shrekuu


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.