C#绘图,奇怪的行为

时间:2010-01-19 12:44:41

标签: c# graphics drawing bitmap brush

以下代码相当简单 - 它用随机选择的像素填充设计图面 - 没什么特别的(暂时忽略第二种方法中的XXXXXXX)。

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);
}

我的问题是......

如果用“Random rnd = new Random();”替换XXXXXXXXX,测试图案完全变成相同颜色的水平条,因此不是随机的。

有人向我解释为什么会这样?

据我所知,第二次尝试的唯一区别是GetRandomColour方法创建并使用了Random类的新实例,但我看不出它是如何制作水平条的。

4 个答案:

答案 0 :(得分:7)

来自MSDN

  

随机数生成开始   来自种子价值。如果是同一种子   反复使用,同系列的   数字生成。一种方法   产生不同的序列就是为了制造   因此,种子价值取决于时间   与每个人制作不同的系列   随机的新实例。默认情况下,   的无参数构造函数   随机类使用系统时钟   生成其种子值,而它的   参数化构造函数可以采用   Int32值基于数量   在当前时间滴答。然而,   因为时钟有限   分辨率,使用无参数   构造函数创建不同的Random   紧密连续的物体创造   产生的随机数发生器   相同的随机数序列。   以下示例说明了这一点   两个随机对象   紧密连续地实例化   生成一系列相同的随机数   号。

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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