Gra*_*ant 2 c# graphics drawing brush bitmap
以下代码相当简单 - 它用随机选择的像素填充设计表面 - 没什么特别的(暂时忽略第二种方法中的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);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是......
如果用"Random rnd = new Random();"替换XXXXXXXXX,测试图案完全变成相同颜色的水平条,因此不是随机的.
有人向我解释为什么会这样?
据我所知,第二次尝试的唯一区别是GetRandomColour方法创建并使用了Random类的一个新实例,但是我没有看到它是如何形成水平条的..
来自MSDN:
随机数生成从种子值开始.如果重复使用相同的种子,则生成相同的数字序列.产生不同序列的一种方法是使种子值与时间相关,从而与每个新的Random实例产生不同的序列.默认情况下, Random类的无参数构造函数使用系统时钟生成其种子值,而其参数化构造函数可以根据当前时间中的刻度数采用Int32值.但是,由于时钟具有有限的分辨率,因此使用无参数构造函数以紧密连续的方式创建不同的随机对象会创建随机数生成器,从而生成相同的随机数序列.以下示例说明了紧密连续实例化的两个Random对象生成相同的随机数序列.
因此,给定相同的种子,Random实例将产生相同的数字序列.在您的示例中,由于系统时钟的有限分辨率,使用与种子相同的滴答计数创建Random实例,从而产生相同的序列.
连续调用GetRandomColor()
在系统时钟的一个时间片内执行.要测试这一点,请尝试使用减慢方法Thread.Sleep(1)
.您应该看到生成了不同的颜色.