2010-09-03 58 views
2

我目前使用以下函數來生成顏色的隨機十六進制表示。如何在沒有兩種顏色幾乎相似的情況下生成一組隨機顏色?

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 & #FF3EFF

+1

有一點要記住,同時尋找一個解決方案是塔如果你打算在自己附近展示兩種隨機選擇的顏色,那麼很多顏色根本不屬於你,並且會讓你的眼睛流血。 – 2010-09-03 03:45:37

回答

3

使用HSV座標可能會更好。如果不需要白色或黑色,可以將S和V設置爲其最大值,並生成彼此不太接近的H值(模態360度)。然後轉換爲RGB。

+0

多虧了這個,我已經瞭解到,實際上只有12種顏色實際上是獨一無二的(至少這是它在我眼中的樣子) – lock 2010-09-03 05:43:59

1

有幾種方法,其彈簧腦海:

  1. 設置的Ñ標準顏色的陣列和交換他們隨機產生所需的「隨機」的顏色。
  2. 填充一組n顏色;生成隨機顏色並檢查數組中是否存在「關閉」的內容。如果是,請選擇另一種隨機顏色。
  3. 選擇每種顏色作爲確定性序列,如簡單的散列值,旨在不產生重複的值。 Grey code想起來。
0

您的算法可以隨機生成RGB顏色(如現在這樣做),但是您可以例如在接受顏色選擇之前驗證兩個R的顏色是否足夠不同。該算法可以重複步驟(比方說高達4 ... 10 ... N次)對於給定的R,G和/或B.

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/4'S)
  • 重複用於G和B的色調