2012-06-04 89 views
4

我需要一個函數,它將生成三個數字,以便我可以將它們用作我的SVG的RGB模式。
雖然這很簡單,但我還需要確保兩次不使用相同的顏色。 我到底該怎麼做?用簡單的rand(種子時間激活)一次產生一個數字,然後是什麼?我不想排除一個數字,但也許是整個模式?
我有點迷失在這裏。使用rand()函數生成隨機RGB顏色

準確地說,通過第一次調用這個函數,我會得到例如218 199 154,第二我得到47 212 236,這絕對是兩種不同的顏色。有什麼建議麼?

另外我認爲structint r, int g, int b將適合這?

編輯:顏色應該與人眼不同。對不起,沒有提到這一點。

+0

爲了保證相同的顏色永遠不會被使用兩次,只需將生成的顏色存儲到鏈表中(或者如果您有權訪問其中的一個,則使用散列圖)。繼續申請蘭特,直到你的號碼不在該組中。 – Lalaland

+0

另一個考慮:是計算機還是人的「相同顏色」?如果第二個,那麼RGB數字之一的單個差異單位可能不足以使其與眼睛不同。 – Arkadiy

+0

@Arkadiy:與人眼不同。不僅僅是一種顏色不同的顏色,不會被識別。 – Markus

回答

2

您可以使用一組來存儲生成的顏色。第一個instanciate一個新的集合。 然後,每當您生成一種顏色時,查看該值是否出現在您的設置中。 如果記錄存在,請跳過它並重試以獲取新的顏色。如果沒有,你可以使用它,但不要忘記將它緩存在Set之後。 如果您需要生成大量的顏色,這可能會變得無法執行。

+0

這似乎是一個很好的解決方案,但是如何確保它會爲兩個不同的調用生成兩種不同的顏色,而這些顏色會與人眼不同,不僅僅是計算機,我的意思是它是黃色和紫色,不是黃色和淡黃色(人眼幾乎不會識別)。 – Markus

+0

好吧,然後生成一個顏色後,你必須掃描生成的顏色列表,檢查它是不是太靠近。您必須決定2種顏色(r,g,b)之間的最低分數,以使結果具有唯一性。如果所有三個(r g和b)值都與現有顏色太接近,則開始新一代.IE r:200 g:200 b:200。如果您生成199; 199; 150,並將得分設置爲5,則可以使用藍色。如果你輸入195,198,197,所有3種顏色的間隔都低於得分限制。 – jocelyn

+0

好的,我做了你所說的,因爲這對我來說似乎是最簡單的解決方案,它似乎工作得很好。謝謝。 – Markus

0

一個想法是使用位向量來表示生成的顏色集合。對於24位精度,位向量將爲2位,即16,777,216位或2MB。當然,這些日子並不是很多,查找和插入顏色會非常快。

+0

你能解釋一下嗎? :) – Markus

2

最便宜的方法是使用Bloom filter這是一個非常小的記憶智慧,但偶爾會導致誤報(即,你會認爲你已經使用了一種顏色,但你沒有)。基本上,在0-255之間創建三個隨機數,然後保存它們,然後將它們作爲三元組散列並放置在過濾器中。

此外,您可能想要丟棄每個通道的低位,因爲可能並不容易將#FFFFF0與#FFFFF2區分開來。

+0

這很有趣,但問題有點複雜,因爲我想確保同樣的顏色不會再次發生,第一次調用255 255 0,第二次調用255 255 1不會發生。 (因爲這很難辨認) – Markus

+0

我意識到這一點。我的建議並不是按照這個順序製作的。我只是說,在計算過濾器中的散列函數時,應該丟棄低位以防止這種重複。 – apmasell

+0

我已經設法實現了不同的解決方案,但感謝您的時間:) – Markus

2

這裏有一個簡單的方法:

1.Generate a random integer. 
2.Shift it 8 times to have 24 meaningful bits, store this integer value. 
3.Use first 8 bits for R, second group of 8 bits for G, 
     and the remaining 8 bits for B value. 

對於每一個新的隨機數,卻將它8次,如果沒有人用新的使用它匹配比較所有你之前存儲在其他整數值,爲新顏色(步驟3)。

人眼分化是一個有趣的話題,因爲感知閾值因人而異。爲了實現它將整數移位14次,得到R的前6位(填充兩個0再次得到8位),得到第二個6位爲G,最後6位爲B.如果你認爲6位不是好它,它減少5,4 ...

與每個通道4顯著位簡單運行: 我隨機整數是:

0101-1111-0000-1111-0000-1100-1101-0000 

我轉移(也可以用乘法或模)它剩下20次:

0000-0000-0000-0000-0000-0101-1111-0000 

存儲此值。

然後得到前4位爲對於G r第二4個比特和最後4位爲B:

R: 0101 
G: 1111 
B: 0000 

墊它們使它們中的每8位。

R: 0101-0000 
G: 1111-0000 
B: 0000-0000 

將這些用於您的顏色成分。

對於移位後的每個新隨機數,它將它與您存儲的整數值進行比較。如果不同,則將其存儲並用於顏色。