Javascript随机十六进制生成器返回互补色

Javascript随机十六进制生成器返回互补色,javascript,random,hex,Javascript,Random,Hex,我有以下代码: function get_random_color() { return '#' + Math.floor((Math.random() * 0xF00000) + 0x0FFFFF).toString(16); } for (var i=0; i<5; i++) { $(".colors").append("<div style='background:"+get_random_color()+&qu

我有以下代码:

function get_random_color() {
    return '#' + Math.floor((Math.random() * 0xF00000) + 0x0FFFFF).toString(16);
}

for (var i=0; i<5; i++)
  {
      $(".colors").append("<div style='background:"+get_random_color()+"'></div>");
  }
然而,“随机”一代似乎创造了几乎互补的颜色:

为什么我的代码不是完全随机的,颜色似乎总是匹配的

例如:


我不会说他们完全匹配,但我明白你的意思

我认为这可以归结为数学和概率论,并不是说我是这方面的专家,但如果你想一想,你有三个范围,最后是黑色,例如,你需要所有这三个随机数在范围的最末端匹配。正如你所能想象的那样,这比三个不匹配的数字发生的可能性要小。你更可能得到在某个范围内的数字,而不是极端的数字。如果你现在看一些常见的颜色,它们中的许多将依赖于其中一个数字为零或接近零,或者另一端可能为255。要成为黑人,你有1650万分之一的机会成为黑人。任何灰色的都一样


那么解决方案呢?如果你不需要太多的颜色,只需制作一个不同的“漂亮”颜色数组,并使用随机索引从中选择它们

我建议使用CSS3的
HSL
模型。它使用固定的饱和度和亮度,并稍微改变色调——你也可以用同样的方法改变S和L

function get_random_color(H,S,L) {
  return 'hsl(' + ((H+Math.floor(Math.random() * 60))%360) + ','+S+'%,'+L+'%)' ;
}

randomS = Math.round(Math.random()*25)+75; // not too gray!
randomL = Math.round(Math.random()*20)+50-10; // not too light!
randomH = Math.floor(Math.random()*360);
for (var i=0; i<5; i++)
{
  $(".colors").append("<div style='background:"+get_random_color(randomH,randomS,randomL)+";'></div>");
}
函数获取随机颜色(H、S、L){
返回'hsl(+((H+Math.floor(Math.random()*60))%360)+'、'+S+'%、'+L+'%);
}
randomS=Math.round(Math.random()*25)+75;//不要太灰暗!
randomL=Math.round(Math.random()*20)+50-10;//不要太轻!
randomH=Math.floor(Math.random()*360);

对于(var i=0;iIt,您似乎需要一个随机种子。请参阅示例,或者使用不同的颜色模型:HSB。随机选择S和B,并将其用于所有颜色。接下来,选择随机H(色调)--颜色会有所不同,但它们的亮度是相同的。要获得相似颜色的分布,请选择一个随机的起始H,然后在其周围获得颜色值(加或减一个小值)。不幸的是,使用它会生成更接近的互补色。在S&L上使用相同的随机生成器进行尝试也是一个问题。您能解释得更好一点吗?&&您能解释一下您需要什么:相似的颜色还是互补的颜色吗?我的例行程序会创建相似的颜色;要制作互补的颜色,您需要均匀分布d 360度色调。由于您有5种颜色,请尝试
(H+i*(360/5))%360
。抱歉,我想我在问题中说得很清楚:
为什么我的代码不是完全随机的,而且颜色似乎总是匹配的?
我需要一组合适的随机颜色。我知道这几乎是不可能的,但目前至少三种颜色几乎都是免费的。你能在你的问题中添加一些合适的调色板吗接近你的想法?
.colors > div{width:30px; height:30px;}
function get_random_color(H,S,L) {
  return 'hsl(' + ((H+Math.floor(Math.random() * 60))%360) + ','+S+'%,'+L+'%)' ;
}

randomS = Math.round(Math.random()*25)+75; // not too gray!
randomL = Math.round(Math.random()*20)+50-10; // not too light!
randomH = Math.floor(Math.random()*360);
for (var i=0; i<5; i++)
{
  $(".colors").append("<div style='background:"+get_random_color(randomH,randomS,randomL)+";'></div>");
}