随机对象未在C#中处理

时间:2011-10-29 22:19:50

标签: c# xna

我正在使用C#中的平滑地形生成算法并使用XNA显示数据。

我正在制作它所以它在每次迭代的每个点之间创建一个新点,在两者之间的随机高度。这个工作正常,我设置它,以便在第二次迭代时它选择一个像幻灯片2中的随机点,而不是试图在同一轴上的点之间创建一个新点。

发生的事情是循环使用上一次迭代中的相同随机值:http://i.stack.imgur.com/UmWr7.png

这显然不太理想,因为它不是一个适当的随机生成。

如果我在每个点生成后使用Thread.Sleep(20),它可以正常工作:http://i.stack.imgur.com/KziOg.png

如果可能的话,我不想使用Sleep解决方法,因为它非常慢,我想实时使用它。我很确定这与C#垃圾收集器有关。

这是我的获取点代码

Random r = new Random();
int x = (p1.X + p2.X) / 2;
int y;
if (!initial)
       y = r.Next(Math.Min(p1.Y, p2.Y), Math.Max(p1.Y, p2.Y));
else
       y = r.Next(Math.Min(p1.Y, p2.Y) - Game1.screenHeight / 2, Math.Max(p1.Y, p2.Y) + Game1.screenHeight / 2);
return new Point(x, y);

垃圾收集是问题的一部分吗?

解决这个问题的任何建议或解决方案??

2 个答案:

答案 0 :(得分:10)

您可能正在循环中创建一个新的Random对象。

for (/* ... */) {
    int x = new Random().Next(); // Don't do this!
    // ...
}

尝试在程序启动时只创建一个Random实例,然后重新使用它。如果你有多个线程,那么你可以为每个线程使用一个随机对象。

答案 1 :(得分:6)

听起来你可能在每次迭代 1 上创建Random的新实例。这将从当前时间开始播种 - 所以没有睡眠,你会反复得到相同的值;睡着了,你最终会得到一个不同的种子。

答案是在整个程序中重用一个 Random实例 - 但要注意Random不是线程安全的事实。如果你所有的工作都是在UI线程中完成的,你会没事的 - 但是你可能想要使用我在article about Random中给出的一种方法(更多地讨论这个问题)。 / p>


1 是的,既然您已经发布了确实如此的代码。