c#中不处理随机对象

本文关键字:随机 对象 处理 | 更新日期: 2023-09-27 18:12:40

我正在研究c#中的平滑地形生成算法,并使用XNA来显示数据。

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

所发生的是循环使用与前一次迭代相同的随机值:https://i.stack.imgur.com/UmWr7.png

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

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

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

这是我的Get Point Code

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);

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

对于解决这个问题有什么建议或解决方案吗?

c#中不处理随机对象

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

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

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

听起来您可能在每次迭代1上创建一个新的Random实例。这将从当前时间获取种子——所以没有睡眠,你会反复得到相同的值;如果你睡一觉,你最终会得到一个不同的种子。

答案是在整个程序中重用一个 Random实例——但要注意Random不是线程安全的。如果你所有的工作都是在UI线程中完成的,你会很好——但否则你可能想使用我在关于Random的文章中给出的一种方法(它更多地讨论了这个问题)。


1是的,现在你已经发布了代码,确实是这样的