随机遭遇不是那么随意

时间:2010-04-28 07:33:09

标签: c# random

您好我在使用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;
}

现在你可能会注意到那里有很多新的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

正如你所看到的那样,这不是那么随意,但为什么会发生这种情况呢?我该怎么办呢?

4 个答案:

答案 0 :(得分:28)

您正在为所需的每个值创建一个新的Random

尝试创建一个唯一的Random对象并多次调用.Next()函数。

public Color getRandomColor()
{
    Random rand = new Random();

    Color1 = rand.Next(rand.Next(0, 100), rand.Next(200, 255));
    Color2 = rand.Next(rand.Next(0, 100), rand.Next(200, 255));
    Color3 = rand.Next(rand.Next(0, 100), rand.Next(200, 255));
    Color color = Color.FromArgb(Color1, Color2, Color3);
    Console.WriteLine("R: " + Color1 + " G: " + Color2 + " B: " + Color3 + " = " + color.Name);
    return color;
}

取自MSDN documentation on Random object

  

默认情况下,Random类的无参数构造函数使用系统时钟生成其种子值,而其参数化构造函数可以根据当前时间中的滴答数采用Int32值。但是,由于时钟具有有限的分辨率,使用无参数构造函数以紧密连续的方式创建不同的随机对象会创建随机数生成器,从而生成相同的随机数序列

答案 1 :(得分:7)

每个new Random()都是seeded with the current time

如果您快速连续创建多个Random个实例,并且您的计算机运行得足够快,以便它们足够接近以获得相同的种子,它们将返回相同的值序列!

使用一个Random,调用.Next()来获取每个值。

  

现在您可能会注意到有   那里有很多新的Random()   因为我想把它除掉   它可能是相同的概率   实例错误。

这是一个谬论;来自单个Random的数字流均匀分布 - 努力使其随机化。

答案 2 :(得分:5)

您正在顺序创建许多Random对象,这会导致它们以相同/几乎相同的时间戳播种。因此产生随机数但在它们之间相等。

尝试创建一个Random实例并将其用于所有随机数需求。

答案 3 :(得分:1)

当使用一个实例时,随机效果更好。

试试这个:

public Color getRandomColor()
{
    var random = new Random();
    Color1 = random.Next(random.Next(0, 100), random.Next(200, 255));
    Color2 = random.Next(random.Next(0, 100), random.Next(200, 255));
    Color3 = random.Next(random.Next(0, 100), random.Next(200, 255));
    Color color = Color.FromArgb(Color1, Color2, Color3);
    Console.WriteLine("R: " + Color1 + " G: " + Color2 + " B: " + Color3 + " = " + color.Name);
    return color;
}