【发布时间】:2010-04-28 07:33:08
【问题描述】:
您好,我在使用 C# 生成随机数时遇到了一些问题 现在我有了这个功能。
public Color getRandomColor()
{
Color1 = new Random().Next(new Random().Next(0, 100), new Random().Next(200, 255));
Color2 = new Random().Next(new Random().Next(0, 100), new Random().Next(200, 255));
Color3 = new Random().Next(new Random().Next(0, 100), new Random().Next(200, 255));
Color color = Color.FromArgb(Color1, Color2, Color3);
Console.WriteLine("R: " + Color1 + " G: " + Color2 + " B: " + Color3 + " = " + color.Name);
return color;
}
现在你可能会注意到那里有很多 new Random(),那是因为我想排除它可能是同一个实例错误的可能性。
我现在运行这个函数 8 次,几次。 现在这里是输出。
R: 65 G: 65 B: 65 = ff414141
R: 242 G: 242 B: 242 = fff2f2f2
R: 205 G: 205 B: 205 = ffcdcdcd
R: 40 G: 40 B: 40 = ff282828
R: 249 G: 249 B: 249 = fff9f9f9
R: 249 G: 249 B: 249 = fff9f9f9
R: 94 G: 94 B: 94 = ff5e5e5e
R: 186 G: 186 B: 186 = ffbababa
R: 142 G: 142 B: 142 = ff8e8e8e
R: 190 G: 190 B: 190 = ffbebebe
R: 19 G: 19 B: 19 = ff131313
R: 119 G: 119 B: 119 = ff777777
R: 119 G: 119 B: 119 = ff777777
R: 75 G: 75 B: 75 = ff4b4b4b
R: 169 G: 169 B: 169 = ffa9a9a9
R: 127 G: 127 B: 127 = ff7f7f7f
R: 73 G: 73 B: 73 = ff494949
R: 27 G: 27 B: 27 = ff1b1b1b
R: 125 G: 125 B: 125 = ff7d7d7d
R: 212 G: 212 B: 212 = ffd4d4d4
R: 174 G: 174 B: 174 = ffaeaeae
R: 0 G: 0 B: 0 = ff000000
R: 0 G: 0 B: 0 = ff000000
R: 220 G: 220 B: 220 = ffdcdcdc
如您所见,这又不是那么随机了,但为什么会发生这种情况呢?我该如何应对?
【问题讨论】:
-
我在标准化范围内生成随机颜色时遇到了同样的问题。一种不提供种子的快速方法是使用相同的随机流将几个值排列在一起。缺乏精度,但可用于获得稍微多样化的随机分布。例如。 int x = rng.Next() ^ rng.Next();整数幅值 = x * x;浮点值 = x / (float)magnitude;
-
使用此方法,您可以通过以下方式生成稍微更好的颜色分布。颜色 = 颜色 = 新颜色((字节)(rand.Next(0, 255)^ rand.Next(0, 255)),(字节)(rand.Next(0, 255)^ rand.Next(0, 255) )), (byte)(rand.Next(0, 255) ^ rand.Next(0, 255)), (byte)(rand.Next(0, 255) ^ rand.Next(0, 255)))