我正在使用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;
}
答案 0 :(得分:4)
您的Run
方法会创建Random()
的新实例。我怀疑你不想这样做 - 毕竟,你已经得到了一个名为MyRandom
的属性,你在创建数组时会填充它。
刚拿出一行:
MyRandom = new Random();
看看会发生什么。
实际上,每次调用Random
时,您都会创建Run()
的新实例...每个实例都会从当前时间播种。这意味着如果您快速连续几次({在任何实例上)调用Run
,您将在大多数情况下获得相同的distance
,因为种子将是相同的。
如果没有额外的创建,您将为所有灰狗使用相同的Random
实例,这意味着您每次调用Next
时都会生成可能不同的数字。这只是好的,如果它们都在同一个线程中 - 请参阅my article on Random
了解随机性的各种棘手方面的细节。
您的代码已经尝试通过在初始化时设置MyRandom
属性来做正确的事情 - 只是它通过覆盖Run
中的属性来混淆它方法