如何生成一组随机颜色,其中没有两种颜色几乎相似?

时间:2010-09-03 03:22:47

标签: colors

我目前使用以下函数生成颜色的随机十六进制表示。

function getRandomColor($max_r = 192, $max_g = 192, $max_b = 192) {
    if ($max_r > 192) { $max_r = 192; }
    if ($max_g > 192) { $max_g = 192; }
    if ($max_b > 192) { $max_b = 192; }
    if ($max_r < 0) { $max_r = 0; }
    if ($max_g < 0) { $max_g = 0; }
    if ($max_b < 0) { $max_b = 0; }

    return '#' . dechex(rand(0, 192)) . dechex(rand(0, 192)) . dechex(rand(0, 192));
}

请注意,我将最大值设置为192而不是255,这是因为我避免使用非常浅的颜色,因为我将在白色背景中使用随机颜色作为前景。

我的问题是如何生成无限数量的颜色,其中没有几乎相同的颜色。例如:#D964D9&amp; #FF3EFF

3 个答案:

答案 0 :(得分:3)

使用HSV坐标可能更好。如果您不需要白色或黑色,可以将S和V设置为其最大值,并生成彼此不太接近的H值(mod 360度)。然后转换为RGB。

答案 1 :(得分:1)

有几种方法让人想起:

  1. 设置 n 标准颜色的数组,并随机互换以产生所需的“随机”颜色。
  2. 填充一系列 n 颜色;生成一个随机颜色,并检查数组中是否有“关闭”的东西。如果是这样,请选择其他随机颜色。
  3. 选择每种颜色作为确定性序列,如简单的哈希值,旨在不产生重复值。脑海中浮现出Grey code

答案 2 :(得分:0)

您的算法可以随机生成RGB颜色(正如它现在所做的那样)但是您可以例如在接受颜色选择之前验证两个R是否充分不同。对于给定的R,G和/或B,该算法可以重复该步骤(例如最多4 ... 10 ... N次)。

while ( (R1 > $max_r/2) && (R2 > $max_r/2) ) {
// Both are in the upper half of range, get a new random value for R1.
}

其他可能性:

  • 重复范围的下半部分
  • 进一步细分范围(分为1/3或1/4)
  • 重复G和B音色