我正在寻找答案,但找不到任何东西,所以:
我正在制作简单的项目,我对此有疑问:
// fragment of code in parent form
Random r = new Random();
private void BeginGame()
{
SetName();
sheep = new Sheep[howManySheep];
for (int i = 0; i < howManySheep; i++)
sheep[i] = new Sheep(this);
(...)
}
public Sheep DrawSheep
{
set
{
splitContainer1.Panel2.Controls.Add(value);
}
}
// fragment of code in child form
class Sheep : Button
public Sheep(Form1 _parent)
: base()
{
var p = new Point(r.Next(_parent.PanelSize[0]), r.Next(_parent.PanelSize[1]));
Text = null;
Size = new Size(size, size);
BackColor = Color.White;
Tag = nrSheep++;
Location = p;
_parent.DrawSheep = this;
MessageBox.Show(this.Location.ToString());
}
当MessageBox.Show(..)被评论时,它只绘制一只绵羊(我的意思是所有绵羊,但在同一个地方) 当MessageBox.Show(..)被取消注释时,它会绘制一切正常,它应该如何。 我的问题是如何?
答案 0 :(得分:0)
这听起来像是Random
的一个相当常见的问题。当你把它变成类级变量时它通常会消失:
public static Random r = new Random();
通常只需要一个Random
生成器,它需要将其设置为静态。
但为什么MessageBox
有帮助?
最常出现的问题是,不是保留Random
的单个静态实例,而是快速连续创建新实例。这可能发生得如此之快,以至于它们从当前时间得到相同的默认种子,因此将创建相同的数字序列。
现在,显示MessageBox
会在创建新Random
个实例之间花费大量时间,因此问题似乎 已解决但实际上只是隐藏 ..
另一个更隐蔽的方法是隐藏这个(和其他时间相关的问题)它正在使用调试器 - 但不要让它阻止你使用它;-)