我随机做错了什么?

Ada*_*eit 3 c# random xna

我有一些代码使用随机数来确定对象是否特殊.我在每个经常重置的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";
Run Code Online (Sandbox Code Playgroud)

但每次执行此代码时,当它创建4个对象时,当它使其中一个特殊时,它会因为某些原因使它们全部特殊.这段代码有什么问题,或者我是否需要展示更多代码才能解释它?

Dan*_*nik 14

我可以想到为什么会发生这种情况的两个原因.

首先,也许您不小心在对象之间共享引用,因此thiss.typer在所有4种情况下引用相同的对象.

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

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

  • 如果你有一个静态的`Random`对象,请记住random不是线程安全的:http://msdn.microsoft.com/en-us/library/9b3ta19y.aspx (7认同)
  • *默认种子值源自系统时钟并具有有限的分辨率.因此,通过调用默认构造函数紧密连续创建的不同Random对象将具有相同的默认种子值,因此将生成相同的随机数集.使用单个Random对象生成所有随机数可以避免此问题.*http://msdn.microsoft.com/en-us/library/h343ddh9.aspx (6认同)
  • +1我过去因为快速连续使用不同的随机对象而遇到过这样的问题.我通过在我的代码中的某个地方有一个静态的"Random"对象来解决它,任何类都可以访问它. (3认同)
  • @JonathanDickinson根据我链接的msdn文章中的评论,可能发生的最坏情况是,当从不同的线程使用时,Random将为所有后续调用返回0!我不认为这是用户期望的.另请参阅此处的评论:http://msdn.microsoft.com/en-us/library/system.random.aspx.但是,ThreadStatic属性的解决方法很好;) (2认同)