2010-01-19 32 views
2

以下代码非常简单 - 它用随机选择的像素填充设计表面 - 没有什么特别的(现在忽略第二种方法中的XXXXXXX)。C#绘图,奇怪的行为

private void PaintBackground() 
{ 
    Random rnd = new Random(); 

    Bitmap b = new Bitmap(this.Width, this.Height); 
    for (int vertical = 0; vertical < this.Height; vertical++) 
    { 
     for (int horizontal = 0; horizontal < this.Width; horizontal++) 
     { 
      Color randomColour = GetRandomColor(rnd); 
      b.SetPixel(horizontal, vertical, randomColour); 
     } 
    } 

    Graphics g = this.CreateGraphics(); 
    g.DrawImage(b, new Point(0, 0)); 
} 

public Color GetRandomColor(Random rnd) 
{ 
    XXXXXXXXXXXXXXXX 

    byte r = Convert.ToByte(rnd.Next(0, 255)); 
    byte g = Convert.ToByte(rnd.Next(0, 255)); 
    byte b = Convert.ToByte(rnd.Next(0, 255)); 

    return Color.FromArgb(255, r, g, b); 
} 

我的问题是这样的......

如果更换与XXXXXXXXX “随机RND =新的随机();”测试图案完全变成相同颜色的水平条,因此不是随机的。

有人向我解释为什么这是?

至于我可以告诉在第二次尝试,唯一的区别是,GetRandomColour方法创建并使用Random类的新实例,但我不明白如何使单杠..

回答

7

MSDN

随机数生成开始 从种子值。如果重复使用相同的种子 ,则会生成同一系列的 数字。 产生不同序列的一种方法是使 的种子值与时间有关,从而 产生与每个Random的新实例不同的系列。默认情况下, 的 Random类的参数的构造函数使用系统时钟 产生的种子值,而其 参数的构造函数可以利用基于 蜱在当前时间的数量 Int32值。然而,因为时钟具有有限的 分辨率,使用无参数 构造函数创建不同的随机 对象创建 随机数发生器产生 相同序列的随机数。 以下示例说明 两个随机对象 紧密连续地被实例化,生成一系列随机的 数字。

因此,给定相同的种子,随机实例将产生相同的数字序列。在你的例子中,由于系统时钟的有限分辨率,Random实例使用与种子相同的滴答计数创建,导致相同的序列。

连续调用GetRandomColor()在系统时钟的一个时间片内执行。要测试这个,请尝试用Thread.Sleep(1)减慢此方法。您应该看到生成不同的颜色。

+0

我太慢了,删除了我的文章并给了你+1 – jdehaan 2010-01-19 12:59:02

3

你应用程序的运行速度非常快,PRNG正在初始化的种子在整个循环中保持不变。

因此它不是真正的随机,因此名称伪随机数发生器。

+0

虽然在横条不会有细微的变化吗?它们几乎完全对齐 – Grant 2010-01-19 12:53:57

+1

不,RNG使用相同的种子初始化,因此它会生成相同的结果。你的视野只是把它看作线条。 – leppie 2010-01-19 12:56:06

1

随机创建时有一个默认的种子零。在该功能中重新创建它将始终给出相同的编号。在构造函数中创建它,并重用以获得不同的随机数。

+1

错!种子基于tickcount之类的东西,否则你最终会得到一个真正蹩脚的随机课程。 – leppie 2010-01-19 12:50:57

+0

你对我错了。我记得当我实施粒子群优化器时遇到了几乎相同的问题。但是因为每个粒子的序列几乎相同,所以我认为它必须相同。谢谢(你的)信息。 – affan 2010-01-19 12:58:31

1

兰德姆并不是真正的随机。他们是"Psuedo-random"。所有你真正做的(从机器的角度来看)都是一次又一次地在起始点产生相同的随机数。你真正需要做的是传递构造函数一个“种子”或者有一个更高范围的随机,你可以调用Next()方法。

+0

所以在尝试#2中 - 通过创建一个新的实例并询问下一个(0,255)它每次都会有相同的返回值?这似乎很难相信..? – Grant 2010-01-19 12:51:55

+0

是的,因为它们都有相同的起点。随机性算法根本不是随机的。就像文章所说,它是“随机的”。它有一个明确的算法,所以给定相同的起始点,相同的种子,每次都会得到相同的结果。 – 2010-01-19 13:27:01