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

本文关键字:随机 整数 for 循环 数组 | 更新日期: 2023-09-27 18:15:03

这是我第一次发帖。希望这个问题不会让你太困惑。我正在为一本c#初学者的书做实验,现在卡住了。我在创建一个"模拟狗比赛"程序。当我点击"Start Race"按钮时,狗会随着计时器的每一次滴答(1到30之间的随机整数)向右移动,直到到达终点。我试过以不同的方式切换代码,阅读数组,Random类和在线for循环,但出于某种原因,无论如何,狗总是以相同的速度移动。它们需要以不同的随机速率移动。

一个解决方案会很好,但我真正想知道的是,为什么我的代码不工作?每个狗不应该被分配一个不同的随机数,因为它通过数组的"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(); 
            }
        }
    }

这是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; 
                }
            }
        }
    }
}

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

这是一个常见的问题,你不创建Random的每个迭代的新实例,你调用Next()在同一实例,问题是因为当你创建一个随机的新实例默认种子是基于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(); 
        }
    }

我建议你使用伪随机数。

因为每次执行new Random()时,它都使用时钟初始化。这意味着在一个紧密循环中,你会多次得到相同的值。您应该保留单个Random实例,并在同一个实例上继续使用Next。有关仅生成一个随机数的随机数生成器的更多信息

在紧密循环或快速连续中初始化两个随机数生成器将创建两个可以生成相同随机数序列的随机数生成器。

:https://msdn.microsoft.com/en-us/library/system.random%28v=vs.110%29.aspx?f=255& MSPPError = -2147217396 #多个

自己试试:https://dotnetfiddle.net/oa4aTL