【问题标题】:Random object not disposing in C#随机对象不在 C# 中处理
【发布时间】:2011-10-29 22:19:49
【问题描述】:

我正在研究 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);

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

有解决这个问题的建议或解决方案吗?

【问题讨论】:

    标签: c# xna


    【解决方案1】:

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

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

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

    【讨论】:

    • 啊,不敢相信我没有看到这个。非常感谢您的帮助。
    【解决方案2】:

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

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


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

    【讨论】:

    • 感谢关于 Random 不是“线程安全”的信息也很有帮助
    猜你喜欢
    • 2011-09-12
    • 2017-10-29
    • 2011-04-26
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    相关资源
    最近更新 更多