C# 在数组中生成随机数
第一篇帖子和一个很难回答的问题。我花了好几个小时试图让这个程序运行起来,最终不得不作弊并从其他人那里查找答案 当我运行以下代码时,每个灰狗数组元素接收相同的随机数。当我用表单上的随机变量初始化数组元素时,它会生成不同的随机数,但我不明白为什么我的初始代码不起作用。谁能解释一下吗 我的代码不起作用:(相关代码) 首先,我制作的课程:C# 在数组中生成随机数,c#,C#,第一篇帖子和一个很难回答的问题。我花了好几个小时试图让这个程序运行起来,最终不得不作弊并从其他人那里查找答案 当我运行以下代码时,每个灰狗数组元素接收相同的随机数。当我用表单上的随机变量初始化数组元素时,它会生成不同的随机数,但我不明白为什么我的初始代码不起作用。谁能解释一下吗 我的代码不起作用:(相关代码) 首先,我制作的课程: public class Greyhound { public PictureBox MyPictureBox = new PictureBox(); //
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();
}
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
}
公共灰狗[]灰狗数组=新灰狗[4];
私有void setupTrack()
{
对于(int i=0;i<4;i++)
{
灰狗数组[i]=新灰狗();
}
灰狗数组[0]。MyPictureBox=pictureBox1;
灰狗数组[1]。MyPictureBox=pictureBox2;
灰狗数组[2].MyPictureBox=pictureBox3;
灰狗数组[3]。MyPictureBox=pictureBox4;
}
私有无效计时器1_刻度(对象发送方,事件参数e)
{
对于(int i=0;i<4;i++)
{
灰狗数组[i].Run();
}
}
这是因为默认情况下Random
构造函数需要时间作为初始种子。如果您同时初始化所有4个元素,您将拥有相同的随机生成器。如果您不关心多线程,请将其设为静态,这样它将被初始化一次。您正在初始化灰狗实例n循环非常快。这就是为什么所有Random
iNtance都获得相同的种子(使用默认构造函数将系统时间用作种子)
默认种子值源自系统时钟,具有有限的
分辨率。因此,在中创建的不同随机对象
通过调用默认构造函数关闭继承将具有
相同的默认种子值,因此将生成相同的
随机数集
因此,您必须将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;
}
}
请注意,我还制作了随机化器
,以确保使用构造函数
以下是循环:
Random randomizer = new Random();
for (int i = 0; i < 4; i++)
{
GreyhoundArray[i] = new Greyhound(randomizer);
}
Random randomizer=new Random();
对于(int i=0;i<4;i++)
{
灰狗阵列[i]=新灰狗(随机化器);
}
第一个代码的问题是,类的每个实例都有自己的随机生成器。如果及时创建实例,则所有随机生成器将使用相同的起始值进行种子设定,因为默认种子是使用系统时钟创建的
要对所有实例使用一个随机生成器,可以在创建实例之前创建随机生成器,并将其传递给构造函数,以便所有实例都可以访问它:
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);
}
Random rnd=new Random();
灰狗[]灰狗数组=新灰狗[4];
for(int i=0;i