for循环中的C#数组产生相同的随机整数值

use*_*070 3 c# arrays random loops for-loop

这是我第一次发帖.希望这个问题不会太混乱.我正在为一个初学者C#书的实验室工作,现在卡住了.我正在创建一个"狗赛跑模拟器"计划.当我点击"开始比赛"按钮,狗,直到他们到达终点移动到与定时器的每个替权利,在1到30之间的随机整数.我试着开关了代码一吨的不同的方式,阅读阵列,Random类,以及环网上,但出于某种原因,不管是什么,狗总是以同样的速度移动.它们需要以不同的随机速率随每个刻度移动.

解决方案会很好,但我真的想知道,为什么我的代码不起作用?不应该为每只狗分配一个不同的随机数,因为它循环通过数组的'i'值?

图片可以在这里找到:http: //makingspidersense.com/dograce.png

这是Form1代码:

Greyhound[] dogs = new Greyhound[4];

    private void startRaceButton_Click(object sender, EventArgs e)
    {
        timer1.Start();
        dogs[0] = new Greyhound() { MyPictureBox = dog1PictureBox };
        dogs[1] = new Greyhound() { MyPictureBox = dog2PictureBox };
        dogs[2] = new Greyhound() { MyPictureBox = dog3PictureBox };
        dogs[3] = new Greyhound() { MyPictureBox = dog4PictureBox };
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        for (int i = 0; i < 4 ; i++)
        {
            if (dogs[i] != null)
            {
                dogs[i].Randomizer = new Random();
                dogs[i].Distance = dogs[i].Randomizer.Next(1, 30);
                dogs[i].Move(); 
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是Greyhound类代码:

class Greyhound
{
    public PictureBox MyPictureBox; 
    public bool GoingForward = true;
    public Random Randomizer; 
    public int Distance;

    public void Move() 
    {
        if (MyPictureBox != null)
        {
            if (GoingForward == true)
            {
                MyPictureBox.Left += Distance; 
                if (MyPictureBox.Left >= MyPictureBox.Parent.Width - MyPictureBox.Width)
                {
                    GoingForward = false; 
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

bto*_*rdz 6

这是一个常见的问题,您鸵鸟政策创建的新实例Random每次迭代,你叫Next()上同一个实例,这个问题是因为当你创建随机默认种子的新intance基于DateTime.Now

var r = new Random();
for (int i = 0; i < 4 ; i++)
    {
        if (dogs[i] != null)
        {
            dogs[i].Randomizer = r;
            dogs[i].Distance = r.Next(1, 30);
            dogs[i].Move(); 
        }
    }
Run Code Online (Sandbox Code Playgroud)