限制随机颜色生成器函数在javascript中生成特定颜色

限制随机颜色生成器函数在javascript中生成特定颜色,javascript,colors,Javascript,Colors,我使用以下函数生成随机颜色: function getRandomColor() { var letters = '0123456789ABCDEF'.split(''); var color = '#'; for (var i = 0; i < 6; i++) { color += letters[Math.round(Math.random() * 15)]; } return color; } 函数getRandomColor

我使用以下函数生成随机颜色:

function getRandomColor() {
    var letters = '0123456789ABCDEF'.split('');
    var color = '#';
    for (var i = 0; i < 6; i++) {
        color += letters[Math.round(Math.random() * 15)];
    }
    return color;
}
函数getRandomColor(){ 变量字母='0123456789ABCDEF'。拆分(''); var color='#'; 对于(变量i=0;i<6;i++){ 颜色+=字母[Math.round(Math.random()*15)]; } 返回颜色; } 我想将此限制为生成除“#A9A9”或所有灰度(如果可能)之外的所有颜色


在生成颜色并再次调用函数之后,设置一些if条件似乎不是很有效。请建议我该怎么做?

这会稍微限制您的整体颜色空间,但您可以这样做,因为您正在尝试去除(真实)灰色,只有当所有三个RGB值都相等时才会出现这种情况

var letters1 = '0123456789ABCDEF'.split('');
var letters2 = '0123456789ABCDEF'.split('');
var color = '#';
var rand1, rand2, i, len = letters1.length;
for (i = 0; i < 3; i += 1) {
    rand1 = Math.floor(Math.random() * (len - i));
    rand2 = Math.floor(Math.random() * (len - i));
    color += letters1.splice(rand1,1) + letters2.splice(rand2,1);
}
然后你可以限制你想要的东西的色调范围,并确保S/L设置在合理的位置,你只会得到颜色,没有灰色,黑色或白色。W3学校对公认的价值观有很好的理解。如果必须是RGB,您可以很容易地将HSL转换为RGB,请查看

作为一个例子,这个函数将根据我对绿色停止/开始色调的解释,仅生成非绿色颜色

randomNonGreenColor = function () {
    //skip green
    var ranges = [[0, 60], [180, 359]];

    //get max random
    var total = 0, i;
    for (i = 0; i < ranges.length; i += 1) {
        total += ranges[i][1]-ranges[i][0] + 1;
    }

    //get random hue index
    var randomHue = Math.floor(Math.random() * total);

    //convert index to actual hue
    var pos = 0;
    for (i = 0; i < ranges.length; i += 1) {
        pos = ranges[i][0];
        if (randomHue + pos <= ranges[i][1]) {
            randomHue += pos;
            break;
        } else {
            randomHue -= (ranges[i][1] - ranges[i][0] + 1);
        }
    }

    return 'hsl(' + randomHue + ',100%,50%)';
}
randomNonGreenColor=函数(){
//跳过绿色
风险值范围=[[0,60],[180,359];
//获取最大随机数
var总=0,i;
对于(i=0;i如果(randomHue+pos只需检查黑名单颜色并再次调用该函数是最简单的,并且您必须首先生成颜色,以查看它是否是您想要的颜色。不,我认为应该有这样的方法:因为所有RGB代码的灰色阴影值都是相同的,所以如果颜色的所有红绿色和蓝色值都是相同的相同,然后忽略,否则包括它。但这应该在生成颜色时进行,而不是在生成颜色后进行检查。当然,你可以编写一些只生成你想要的颜色的函数,但你不能只使用
Math.random
和一个生成颜色的小快速函数。很可能是如果颜色被列入黑名单,则比再次运行该函数要低得多,也要复杂得多
randomNonGreenColor = function () {
    //skip green
    var ranges = [[0, 60], [180, 359]];

    //get max random
    var total = 0, i;
    for (i = 0; i < ranges.length; i += 1) {
        total += ranges[i][1]-ranges[i][0] + 1;
    }

    //get random hue index
    var randomHue = Math.floor(Math.random() * total);

    //convert index to actual hue
    var pos = 0;
    for (i = 0; i < ranges.length; i += 1) {
        pos = ranges[i][0];
        if (randomHue + pos <= ranges[i][1]) {
            randomHue += pos;
            break;
        } else {
            randomHue -= (ranges[i][1] - ranges[i][0] + 1);
        }
    }

    return 'hsl(' + randomHue + ',100%,50%)';
}