第一篇帖子和一个非常菜鸟的问题。我试了很多个小时才能让这个程序工作,最终不得不作弊并从其他人那里查找答案。
当我运行以下代码时,每个greyhound数组元素都会收到相同的随机数。当我在表单上使用随机变量初始化数组元素时,它会生成不同的随机数,但我不明白为什么我的初始代码不起作用。有人可以解释一下吗?
我的代码不起作用:(相关代码)
首先是我上课:
public class Greyhound
{
public PictureBox MyPictureBox = new PictureBox(); //My picturebox object
public int Location = 0; //My location on the racetrack
public Random Randomizer = new Random();
public Run()
{
Location += Randomizer.Next(15);
MyPictureBox.Left = Location;
}
}
然后是表格:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public Greyhound[] GreyhoundArray = new Greyhound[4];
private void setupTrack()
{
for (int i = 0; i < 4; i++)
{
GreyhoundArray[i] = new Greyhound();
}
GreyhoundArray[0].MyPictureBox = pictureBox1;
GreyhoundArray[1].MyPictureBox = pictureBox2;
GreyhoundArray[2].MyPictureBox = pictureBox3;
GreyhoundArray[3].MyPictureBox = pictureBox4;
}
private void timer1_Tick(object sender, EventArgs e)
{
for (int i = 0; i < 4; i++)
{
GreyhoundArray[i].Run();
}
}
答案 0 :(得分:1)
那是因为默认情况下Random
构造函数需要时间作为初始种子。如果你同时初始化所有4个元素,那么你将拥有相同的随机生成器。如果您不关心多线程,请将其设置为静态,以便初始化一次。
答案 1 :(得分:0)
您正在非常快速地初始化循环中的Greyhound
个实例。这就是为什么所有Random
等于获得相同种子的原因(使用默认构造函数将系统时间用作种子)。
默认种子值来自系统时钟并具有有限性 解析度。结果,创建了不同的Random对象 通过调用默认构造函数来关闭连续 相同的默认种子值,因此会生成相同的 随机数集
所以你必须将Random
传递给Greyhound
的构造函数。然后在循环中始终使用相同的Random
实例。
public class Greyhound
{
public PictureBox MyPictureBox = new PictureBox(); //My picturebox object
public int Location = 0; //My location on the racetrack
private Random Randomizer = new Random();
public Greyhound(Random randomizer)
{
this.Randomizer = randomizer;
}
public Run()
{
Location += Randomizer.Next(15);
MyPictureBox.Left = Location;
}
}
请注意,我还Randomizer
确保使用构造函数。
这是循环:
Random randomizer = new Random();
for (int i = 0; i < 4; i++)
{
GreyhoundArray[i] = new Greyhound(randomizer);
}
答案 2 :(得分:0)
您的第一个代码的问题是该类的每个实例都有自己的随机生成器。如果您及时创建实例,则所有随机生成器将以相同的起始值播种,因为默认种子是使用系统时钟创建的。
要为所有实例使用一个随机生成器,您可以在创建实例之前创建随机生成器,并将其传递给构造函数,以便所有实例都可以访问它:
public class Greyhound {
public PictureBox MyPictureBox = new PictureBox(); //My picturebox object
public int Location = 0; //My location on the racetrack
private Random Randomizer;
public Greyhound(Random commonRandomizer) {
Randomizer = commonRandomizer;
}
public Run() {
Location += Randomizer.Next(15);
MyPictureBox.Left = Location;
}
}
用法:
Random rnd = new Random();
Greyhound[] GreyhoundArray = new Greyhound[4];
for (int i = 0; i < GreyhoundArray.Length; i++) {
GreyhoundArray[i] = new Greyhound(rnd);
}