【问题标题】:C# Array within for loop produces the same random integer values [duplicate]for循环中的C#数组产生相同的随机整数值[重复]
【发布时间】:2015-12-26 10:38:30
【问题描述】:

这是我第一次发帖。希望这个问题不会太令人困惑。我正在为初学者 C# 书做一个实验室,现在卡住了。我正在创建一个“赛狗模拟器”程序。当我单击“开始比赛”按钮时,狗将在计时器的每个滴答声中以 1 到 30 之间的随机整数向右移动,直到它们到达终点。我尝试了很多不同的方式来切换代码,在线阅读数组、随机类和 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(); 
            }
        }
    }

这是灰狗类代码:

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# arrays loops for-loop random


    【解决方案1】:

    这是一个常见问题,您不会在每次迭代时创建 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(); 
            }
        }
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        我建议您使用Pseudo-Random Numbers

        因为每次您执行new Random() 时,它都会使用时钟进行初始化。这意味着在一个紧密的循环中,您可以多次获得相同的值。您应该保留一个 Random 实例并继续在同一个实例上使用 Next。欲了解更多信息Random number generator only generating one random number

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-22
          • 1970-01-01
          • 1970-01-01
          • 2013-10-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多