ChatGPT解决这个技术问题 Extra ChatGPT

随机颜色生成器

鉴于此功能,我想用随机颜色生成器替换颜色。

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

我该怎么做?


P
Paolo Forgia

使用 getRandomColor() 代替 "#0000FF"

函数 getRandomColor() { var letters = '0123456789ABCDEF';变量颜色 = '#'; for (var i = 0; i < 6; i++) { color += letters[Math.floor(Math.random() * 16)]; } 返回颜色; } function setRandomColor() { $("#colorpad").css("background-color", getRandomColor()); }


请注意,由于 RGB 包装颜色空间的方式,这偏向于非常暗和不饱和的颜色。 Martin Ankerl 也有一篇关于从其他空间(如 HSV)生成颜色的好文章:martin.ankerl.com/2009/12/09/…
使用 Math.round(Math.random()*15) 时命中 0 或 15 的几率仅为 1:30,而其他数字的几率为 1:15。
您可以删除 .split('') 调用。字符串已经有数组索引器。
您也可以使用 Generator Function 作为 such
@WebWanderer 是的,有 16777216 种可能的 RGB 颜色变化。执行 toString(16) 将为您提供一个十六进制值。这是产生颜色变化的更快和更准确的方式。注意 16777215 和 16777216 的区别。那是因为我们从 0 开始计数。所以你有 16777216 种不同的颜色。但最大值为 16777215
P
Peter Mortensen

我怀疑任何事情都会比这个更快或更短:

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

挑战!


你忘了用零填充。
'#'+(Math.random()*0xFFFFFF<<0).toString(16);
@Mohsen,仅供参考,您的代码时不时会产生无效的 5 位数字
结果未填充到 6 位
('00000'+(Math.random()*(1<<24)|0).toString(16)).slice(-6) 将始终返回 6 的长度。尽管此方法仍会(很少)返回小数字,这些数字会给出像 000cf40000a7 这样的结果,我认为这有点 hacky。在这些情况下,红色分量对随机颜色没有贡献。
D
Duc Filan

这是对这个问题的另一种看法。

我的目标是创造充满活力和独特的色彩。为了确保颜色不同,我避免使用随机生成器并从彩虹中选择“均匀分布”的颜色。

这非常适合在 Google 地图中创建具有最佳“唯一性”的弹出标记(即,没有两个标记具有相似的颜色)。

/**
 * @param numOfSteps: Total number steps to get color, means total colors
 * @param step: The step number, means the order of the color
 */
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);
}

如果您想查看实际效果,请参阅 Simple JavaScript Rainbow Color Generator for Google Map Markers


我已经简化了与类似问题的答案相同的想法stackoverflow.com/a/14187677/421010
那么参数的值是多少?
我也创造了这样的东西,但它非常随机且非常独特。伪代码是 here。它使用 hsv 而不是 rgb,因为 hsv 具有更可预测的行为。如果您想查看 Python 实现,我使用了它 herehere。您必须在代码中搜索“颜色”。
@RobertMolina:对不起,我把我的东西搬到了 Gitlab。伪代码现在是 here,带有项目 herehere
如何避免鲜艳的颜色?
b
bluenote10

谁能打败它?

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

保证一直工作http://jsbin.com/OjELIfo/2/edit

基于 eterps's comment,如果随机颜色的十六进制表示非常短(0.730224609375 => 0.baf),上面的代码仍然可以生成更短的字符串。

此代码应适用于所有情况:

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

当 Math.random() 返回 0.022092682472568126 时,此代码会生成无效的 '#5a7dd' 字符串。疯狂的!
喜欢这个,因为#ffffff 不经常出现。
在很多情况下这是行不通的。检查 Math.random() 的以下输出... 0.730224609375, 0.43603515625, 0.957763671875,列表还在继续...
简短版本:当 Math.random 返回 0.125 时,结果为 "#0.2"(无效)
或者更基本:0Math.random 的有效返回值,而 '#' + (0).toString(16).substr(-6)"#0"。如果你不介意我会罢工 - 虽然 它保证一直工作 以避免混淆其他人?
d
devsaw

您还可以使用所有优秀浏览器上可用的 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)'
没问题,我很惊讶没有人使用 hsl 的力量 :)
stackoverflow.com/a/23861752/1693593,不需要 hsla,它 alpha=1,只需使用 hsl
您不能以这种方式生成 16M 色彩(例如,您永远不会得到黑白灰度) - 但是是的 - 如果我们对每个组件使用随机,那么我们会得到所有 hsl 色彩
+1 这使得使用亮度和饱和度来设置随机背景颜色更容易,同时确保文本始终可读
P
Peter Mortensen

不需要十六进制字母的散列。 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();
}

N
Nicolas Buduroi

我喜欢这个:'#' + (Math.random().toString(16) + "000000").substring(2,8)


'#' + Math.floor(Math.random()*16777215).toString(16);
@MohammadAnin 有 16 分之一的机会产生少于 6 位的数字
这可能会产生无效的颜色。例如'#' + (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)
P
Peter Mortensen

具有亮度控制的随机颜色生成:

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

非常酷,虽然主要是产生“粉彩”,而不是我看到亮度时希望的更鲜艳的颜色。仍然进入我的花招!
我真的很喜欢这个,因为您可以自定义它以与您的网站调色板相协调
P
Peter Mortensen

Paul Irish Random Hex Color Code Generator in JavaScript 撰写的文章绝对精彩。利用:

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

感谢Haytam for sharing padStart 解决了十六进制代码长度问题。


这有时会返回非格式正确的颜色值,如“1fa4c”(需要 3 或 6 个字符)
@jj_ 是吗?抱歉,我没有注意到这一点。感谢分享
当随机返回 0.00001 则结果为 #a7(无效颜色)
'#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')
G
Gil Epshtain

如果您像我一样是菜鸟,对十六进制等一无所知,这可能更直观。

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

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

您只需要以 'rgb(255, 123, 220)' 之类的字符串结尾


不过,您必须使用 256 才能获得 0。
j
jt3k
'#'+Math.random().toString(16).slice(-3) // three-numbers format aka #f3c
'#'+Math.random().toString(16).slice(-6) // six-number format aka #abc123

我喜欢这个,因为它的易读性
如果 Math.random() 返回 0.125 那么结果将是 #0.2(无效颜色)(您需要添加一些填充而不是切片)
你说的对!但是在我的一生中,我没有遇到少于七个字符的 Math.random() 的值 =)
P
Peter Mortensen

这是@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 的响应在大多数情况下会更好
P
Peter Mortensen

利用:

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

可能是这样;但是您更喜欢哪个网站可能的 Google Adwords 收入? =)
哪个网站给你答案?如果他们为您提供答案,他们应该会获得成功。
@FunkyDude 现在这个结果是谷歌上的第一名,stackoverflow 存在的原因是不要经常使用谷歌;)
b
bryc

有很多方法可以做到这一点。这是我做的一些:

短单线,保证有效颜色

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

生成六个随机十六进制数字 (0-F)

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

// ES6 one-liner version
[..."000000"].map(()=>Math.random().toString(16)[2]).join("")

生成单个 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;
}

过度设计的十六进制字符串(异或 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 one-liner:当随机返回 0.125 时,结果为 #0.2(无效颜色)
@KamilKiełczewski 0.125 = 3FC0000000000000 以 IEEE 十六进制表示。 3个十六进制数字是指数,13个是尾数。尾数完全为空的可能性为 4.5 万亿分之一。我在 Firefox/Chrome 中测试了 1 亿次。你只是试图打破它;)。 Math.random 应该永远给你 0.125。如果是这样,则 PRNG 有问题,这不是我的问题。 0.5、0.25、0.0625 等分数是无用的,它们不包含随机性。也许您有解决这种极端情况的方法,嗯? ;)
是的'#'+Math.random().toString(16).split('.')[1].slice(-6).padStart(6,0),但我更喜欢this
你能证明 Math.random() 永远不会给出这样的数字(在十六进制表示中,点后的数字少于 6)吗?你能解释一下 0.5 比任何其他数字更随机是什么意思吗?你说这不是你的问题 - 是的,你是对的 - 除非你能提供证据,否则问题有程序使用你的代码(但是在这种情况下,这将意味着 Math.random() 有问题,因为它排除了一些'特殊'数字...)
我看到你修好了 - 甚至比我在 this comment +1 中更短
P
Peter Mortensen

地图

总是返回 a valid RGB 颜色:

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

让 c= `rgb(${[1,2,3].map(x=>Math.random()*256|0)})` console.log(c);文档.body.style.background=c


P
Peter Mortensen

最高答案的最高投票评论表明 Martin Ankerl 的方法比随机十六进制数更好,虽然我没有改进 Ankerl 的方法,但我已经成功地将其翻译成 JavaScript。

我想我会为这个已经超大的 Stack Overflow 问题发布一个额外的答案,因为顶部的答案有另一个评论链接到一个 Gist 与 Ankerl 逻辑的 JavaScript 实现,并且该链接已损坏 (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) : '';
}

// The next two methods are converted from Ruby to JavaScript.
// It is sourced from http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/

// # HSV values in [0..1[
// # returns [r, g, b] values from 0 to 255
const hsv_to_rgb = (h, s, v) => {
  const h_i = Math.floor(h*6)
  const f = h*6 - h_i
  const p = v * (1 - s)
  const q = v * (1 - (f * s))
  const t = v * (1 - (1 - f) * s)
  let r, g, b
  switch(h_i) {
    case(0):
      [r, g, b] = [v, t, p]
      break
    case(1):
      [r, g, b] = [q, v, p]
      break
    case(2):
      [r, g, b] = [p, v, t]
      break
    case(3):
      [r, g, b] = [p, q, v]
      break
    case(4):
      [r, g, b] = [t, p, v]
      break
    case(5):
      [r, g, b] = [v, p, q]
      break
  }
  return [Math.floor(r * 256), Math.floor(g * 256), Math.floor(b * 256)]
}

// # Use the golden ratio
const golden_ratio_conjugate = 0.618033988749895
let h = Math.random() // # Use a random start value
const gen_hex = (numberOfColors) => {
  const colorArray = []
  while (numberOfColors > 0) {
    h += golden_ratio_conjugate
    h %= 1
    colorArray.push(rgb2hex(hsv_to_rgb(h, 0.99, 0.99)))
    numberOfColors -= 1
  }
  console.log(colorArray)
  return colorArray
}

gen_hex(100)

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


谢谢。我需要它,而你不厌其烦地转换了 Martin 的文章。 (当然,Martin 建议的参数是 (h, 0.5, 0.95),这会产生更好的颜色)。我搜索了很多,没有找到任何 nodejs 包是这样的。我认为成为一个 npm 包是值得的。在这方面,如果您需要帮助,可以指望我。
P
Peter Mortensen

正则表达式

始终返回 valid hex 6-digit 颜色

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

让 c= "#xxxxxx".replace(/x/g, y=>(Math.random()*16|0).toString(16));控制台.log(c);文档.body.style.background=c


E
Erin Heyming
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
另一个 ex: 8 -> 08

.substr(-2) 只获取最后两个字符。
例如:074 -> 74
另一个 ex: 08 -> 08(如果我们没有添加 "0",这将产生“8”而不是“08”)

for 循环运行此循环 3 次,将每个结果添加到颜色字符串中,产生如下内容:
#7408e4


P
Peter Mortensen

填充到确切大小的简短答案:

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

O
Ollie Edwards

因此,虽然这里的所有答案都很好,但我希望对输出进行更多控制。例如,我想防止任何接近白色的色调,同时确保我获得明亮鲜艳的色彩而不是褪色。

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 值。您可以不带参数调用它并获取我的默认设置,该设置通常会生成非常鲜艳的颜色和曾经明显的主色调,或者您可以提供自己的范围数组。


Google Map API 仅支持“#FFFFFF”格式的十六进制 HTML 颜色。
当然,将数字转换为十六进制 n.toString(16) 非常简单,唯一的问题是您需要零填充以确保从内部 g 函数获得两个字符的返回值。
C
ChandrasekarG

你可以使用这个简单的功能

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

当随机返回 0.001 结果为 "#4189"(无效颜色 4 位)
К
Константин Ван

为了体面的随机性。

随机颜色

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

随机 alpha,随机颜色。

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

S
Salman A

另一个随机颜色生成器:

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

I
InternalFX

使用 distinct-colors

它生成视觉上不同颜色的调色板。

distinct-colors 是高度可配置的:

选择调色板中有多少种颜色

将色调限制在特定范围内

将色度(饱和度)限制在特定范围内

将亮度限制在特定范围内

配置调色板的一般质量


3541 行代码..这里的其他答案大约是 6-10 行...我印象深刻的是有人写了这么多行代码只是为了选择不同的颜色..
挑选真正视觉上不同的颜色需要更多的数学运算,而不仅仅是随机颜色生成器。
我只是在 2 行中完成了.. 修改了这个函数:stackoverflow.com/a/20129594/104380
没那么简单。 suggested reading
谢谢,非常有趣的文章。我的方法总是提供相同的颜色,结果是一致且独特的。我猜在某些情况下,您可能需要非常随机、分布良好的颜色,这些颜色对人眼来说很漂亮。
2
2 revs, 2 users 73% user1106925

Array.prototype.reduce 使它非常干净。

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

对于旧浏览器,它需要一个 shim。


在 chrome 控制台中总是返回 #000000
佚名
function get_random_color() {
    return "#" + (Math.round(Math.random() * 0XFFFFFF)).toString(16);
}

http://jsfiddle.net/XmqDz/1/


A
Ali Khosro

我想创造非常独特和充满活力的颜色(用于图形)。对于任何严重的事情,hsl 是比 rgb 更好的方法。如有必要,您可以将 hsl 转换为 rgb,正如其他人已经提到的那样。

简单的方法:

创建一个从 0 到 360 的随机色调

创建一个从 0.5 到 1(或 50 到 100)的随机饱和度以实现鲜艳度

将亮度固定为 50% 以获得最佳可见度。

color_generator = () => hsl (360*Math.random(), 0.5 + Math.random()/2, 0.5)

修改方式

它创造了一个非常漂亮的明亮和鲜艳色彩的光谱,但问题是在通常的色谱中,红色、绿色、蓝色色调比黄色、青色和紫色更占主导地位。所以,我通过 acos 函数改变了色调。技术原因很无聊,所以我跳过它,但你可以在 wiki 中挖掘。

color_generator = () => {
    let color_section = Math.floor(Math.random()/0.33) // there are three section in full spectrum
    let transformed_hue = Math.acos(2*Math.random() - 1)/3.14 // transform so secondary colors would be as dominant as the primary colors
    let hue = 120*color_section + 120*transformed_hue
    return hsl(hue, 0.5 + Math.random()/2, 0.5)
}

结果是我在尝试了许多其他方法后得到的最好的色谱。

参考:

https://observablehq.com/@d3/color-schemes

https://en.wikipedia.org/wiki/HSL_and_HSV


P
Peter Mortensen

此功能以两种方式超越其他答案:

它试图通过在 20 次尝试中找出哪种颜色与 HSV 锥中的其他颜色具有最远的欧几里德距离来生成尽可能不同的颜色。

它允许您限制色调、饱和度或值范围,但它仍会尝试在该范围内选择尽可能不同的颜色。

它不是超级高效,但对于合理的值(谁甚至可以轻松区分 100 种颜色?)它已经足够快了。

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

P
Peter Mortensen

我的版本:

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

我认为非随机 0 使颜色不够 random XD
我们随机生成一个从 0ffffff 的十六进制数。这是一个完美的uniform distribution。由于浏览器使用方面的考虑,该零仅用于完成字符串。我建议您在此解决方案上更加小心。
不过,我确实做了一些调整,与您的评论无关:)
谢谢普罗斯塔科夫。 :D
a
alexmagnus

一点增强的单线,使方法更生动

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