使用rand()函数生成随机RGB颜色

时间:2012-06-04 14:22:08

标签: c random colors svg srand

我需要一个能生成三个数字的函数,所以我可以将它们用作我的SVG的RGB模式 虽然这很简单,但我还需要确保两次使用相同的颜色。 我到底该怎么做?使用简单rand(种子时间有效)一次生成一个数字然后是什么?我不想排除一个数字,但可能是整个模式?
我有点迷失在这里。

准确地说,首先调用这个函数我会得到例如218 199 154,然后我会得到47 212 236,这肯定是两种不同的颜色。有什么建议?

另外我认为带struct的{​​{1}}适合这个吗?

编辑:颜色应与人眼不同。很抱歉没有提到这个。

4 个答案:

答案 0 :(得分:2)

您可以使用一组来存储生成的颜色。 首先实现一个新的集合。 然后,每次生成颜色时,查看集合中是否存在该值。 如果记录存在,请跳过它并重试新颜色。如果没有,你可以使用它,但不要忘记将它缓存在Set after中。 如果您需要生成大量颜色,这可能会变得无法实现。

答案 1 :(得分:2)

最便宜的方法是使用Bloom filter,这是一个非常小的记忆,但偶尔会出现误报(也就是说,你会认为你使用了一种颜色,但你没有) 。基本上,在0-255之间创建三个随机数,保存它们然后你喜欢,将它们哈希为三元组并将哈希放在过滤器中。

此外,您可能希望丢弃每个通道的低位,因为它可能不容易告诉#FFFFF0与#FFFFF2。

答案 2 :(得分: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位),得到G的第二个6位,B的最后6位。如果你认为6位不是好的,减少它5,4 ......

简单运行每个通道有4位有效位: 我的随机整数是:

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

我移动(你也可以使用乘法或模数)它左转20次:

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

存储此值。

然后获得G的前4位和G的后4位,以及B的最后4位:

R: 0101
G: 1111
B: 0000

将它们填充为8位。

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

将它们用于您的颜色组件。

对于移位后的每个新随机数,将其与存储的整数值进行比较。如果不同,则存储并使用它作为颜色。

答案 3 :(得分:0)

一个想法是使用位向量来表示生成的颜色集。对于24位精度,位向量将为2 24 位长,即16,777,216位或2 MB。当然不是很多,现在,查找和插入颜色会非常快。