4

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

准确地说,通过第一次调用这个函数,我会得到例如 218 199 154,然后我会得到 47 212 236,这绝对是两种不同的颜色。有什么建议么?

另外我认为structwithint r, int g, int b适合这个吗?

编辑:颜色应该与人眼不同。很抱歉之前没有提到这一点。

4

4 回答 4

2

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

于 2012-06-04T14:32:12.247 回答
2

最便宜的方法是使用Bloom 过滤器,它在内存方面非常小,但偶尔会导致误报(即,您会认为您使用了一种颜色,但您没有使用)。基本上,创建 0-255 之间的三个随机数,随意保存它们,将它们散列为三元组并将散列放入过滤器中。

此外,您可能想要丢弃每个通道的低位,因为可能不容易区分 #FFFFF0 与 #FFFFF2。

于 2012-06-04T14:42:16.623 回答
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

存储此值。

然后为 R 获取前 4 位,为 G 获取后 4 位,为 B 获取后 4 位:

R: 0101
G: 1111
B: 0000

填充它们以使它们中的每一个为 8 位。

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

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

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

于 2012-06-05T10:41:28.113 回答
1

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

于 2012-06-04T14:38:09.450 回答