Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在数组中生成随机数_C# - Fatal编程技术网

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