比赛的一天 - 首先是C#

时间:2015-07-26 08:40:40

标签: c# random head

我正在使用Head First C#书中的C#Lab。

当我按下开始按钮时 - 狗应该跑,直到其中一只到达终点。每只狗应该以随机的速度运行,但我的所有狗都以相同的速度运行; /

狗初始化:

 GreyhoundArray[0] = new Greyhound(){
            MyPictureBox = GreyhoundPictureBox1,
            StartingPosition = GreyhoundPictureBox1.Left,
            RacetrackLenght = TrackPictureBox.Width - GreyhoundPictureBox1.Width,
            MyRandom = MyRandom                
        };
        GreyhoundArray[1] = new Greyhound(){
            MyPictureBox = GreyhoundPictureBox2,
            StartingPosition = GreyhoundPictureBox2.Left,
            RacetrackLenght = TrackPictureBox.Width - GreyhoundPictureBox2.Width,
            MyRandom = MyRandom
        };
        GreyhoundArray[2] = new Greyhound(){
            MyPictureBox = GreyhoundPictureBox3,
            StartingPosition = GreyhoundPictureBox3.Left,
            RacetrackLenght = TrackPictureBox.Width - GreyhoundPictureBox3.Width,
            MyRandom = MyRandom
        };
        GreyhoundArray[3] = new Greyhound(){
            MyPictureBox = GreyhoundPictureBox4,
            StartingPosition = GreyhoundPictureBox4.Left,
            RacetrackLenght = TrackPictureBox.Width - GreyhoundPictureBox4.Width,
            MyRandom = MyRandom
        };

开始按钮代码:

private void StartButton_Click(object sender, EventArgs e)
    {
        timer1.Enabled = true;
    }

计时器代码:

private void timer1_Tick(object sender, EventArgs e)
    {
        for (int i = 0; i < 4; i++)
        {
            if (GreyhoundArray[i].Run())
                timer1.Enabled = true;
            else
                timer1.Enabled = false;
        }
    }

运行方法:

public bool Run()
    {
        MyRandom = new Random();

        int distance = MyRandom.Next(1, 5);
        MyPictureBox.Left += distance;

        if(MyPictureBox.Left >= RacetrackLenght)
            return false;
        else
            return true;
    }

1 个答案:

答案 0 :(得分:4)

您的Run方法会创建Random()的新实例。我怀疑你不想这样做 - 毕竟,你已经得到了一个名为MyRandom的属性,你在创建数组时会填充它。

刚拿出一行:

MyRandom = new Random();

看看会发生什么。

实际上,每次调用Random时,您都会创建Run()的新实例...每个实例都会从当前时间播种。这意味着如果您快速连续几次({在任何实例上)调用Run,您将在大多数情况下获得相同的distance,因为种子将是相同的。

如果没有额外的创建,您将为所有灰狗使用相同的Random实例,这意味着您每次调用Next时都会生成可能不同的数字。这只是好的,如果它们都在同一个线程中 - 请参阅my article on Random了解随机性的各种棘手方面的细节。

您的代码已经尝试通过在初始化时设置MyRandom属性来做正确的事情 - 只是它通过覆盖Run中的属性来混淆它方法