生成数组中的随机数

时间:2014-05-07 08:27:52

标签: c#

第一篇帖子和一个非常菜鸟的问题。我试了很多个小时才能让这个程序工作,最终不得不作弊并从其他人那里查找答案。

当我运行以下代码时,每个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();
            }
       }

3 个答案:

答案 0 :(得分:1)

那是因为默认情况下Random构造函数需要时间作为初始种子。如果你同时初始化所有4个元素,那么你将拥有相同的随机生成器。如果您不关心多线程,请将其设置为静态,以便初始化一次。

答案 1 :(得分:0)

您正在非常快速地初始化循环中的Greyhound个实例。这就是为什么所有Random等于获得相同种子的原因(使用默认构造函数将系统时间用作种子)。

MSDN - Random Constructor:

  

默认种子值来自系统时钟并具有有限性   解析度。结果,创建了不同的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);
}