【问题标题】:What am i doing wrong with random?我在随机做错了什么?
【发布时间】:2012-05-24 10:36:56
【问题描述】:

我有一些代码使用随机数来确定对象是否特殊。我在每个经常重置的 4 个对象上使用此代码。

Random rand = new Random();

int i = rand.Next(1, 25);

if (i == 1)
{
    thiss.typer = "boulder";
    thiss.texture = Content.Load<Texture2D>("rock");
}
else if (i == 2)
{
    thiss.typer = "ice";
    thiss.texture = Content.Load<Texture2D>("ice");
}
else if (i == 3)
{
    thiss.typer = "bomb";
    thiss.texture = Content.Load<Texture2D>("bomb");
}
else
    thiss.typer = "normal";

但每次我执行这段代码时,当它创建 4 个对象时,当它使其中一个对象变得特殊时,由于某种原因,它使所有对象都变得特殊。这段代码有什么问题吗,还是我必须展示更多代码才能阐明它?

【问题讨论】:

    标签: xna c# random


    【解决方案1】:

    我能想到这可能发生的两个原因。

    首先,您可能不小心在对象之间共享了一个引用,因此thiss.typer 在所有 4 种情况下都引用了同一个对象。

    其次,更有可能的是,您创建的随机对象共享相同的种子,因此 rand.Next 在所有 4 个实例中返回相同的数字。 当您在没有参数的情况下执行new Random() 时,种子基于当前系统时间。如果你快速连续多次这样做,种子可能是相同的。

    您可以尝试使用相同的 Random 对象,而不是每次使用时都创建一个新对象。这样您还可以避免不必要地创建大量对象。

    【讨论】:

    • +1 由于快速连续使用不同的随机对象,我过去曾遇到过类似的问题。我通过在我的代码中某处任何类都可以访问的静态Random 对象来解决它。
    • 如果你有一个静态的Random 对象,请记住随机不是线程安全的:msdn.microsoft.com/en-us/library/9b3ta19y.aspx
    • 默认种子值来自系统时钟,具有有限分辨率。因此,通过调用默认构造函数连续创建的不同 Random 对象将具有相同的默认种子值,因此将产生相同的随机数集。这个问题可以通过使用单个 Random 对象生成所有随机数来避免。 msdn.microsoft.com/en-us/library/h343ddh9.aspx
    • +1 不要在每次需要使用时都创建一个新的随机数。定期使用同一个。这就是他们的目的。
    • @JonathanDickinson 根据我链接到的 msdn 文章中的 cmets,可能发生的最坏情况是,当从不同线程使用时,Random 将为所有后续调用返回 0!我不认为这是用户所期望的。另请参阅此处的 cmets:msdn.microsoft.com/en-us/library/system.random.aspx。 ThreadStatic 属性的好解决方法;)
    猜你喜欢
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多