Xna 我对random做了什么错事?
我有一些使用随机数来确定对象是否特殊的代码。我在4个经常重置的对象上使用了这段代码Xna 我对random做了什么错事?,xna,c#,random,Xna,C#,Random,我有一些使用随机数来确定对象是否特殊的代码。我在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";
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";
Random rand=new Random();
int i=下一个随机数(1,25);
如果(i==1)
{
this.typer=“boulder”;
thiss.texture=内容物荷载(“岩石”);
}
else如果(i==2)
{
thiss.typer=“ice”;
thiss.texture=内容物荷载(“冰”);
}
else如果(i==3)
{
thiss.typer=“炸弹”;
thiss.texture=Content.Load(“炸弹”);
}
其他的
thiss.typer=“正常”;
但每次我执行这段代码时,当它创建4个对象时,当它使其中一个特殊时,出于某种原因,它使所有对象都特殊。这段代码有什么问题吗,或者我需要展示更多的代码来解释它吗?我可以想出两个原因来解释为什么会发生这种情况 首先,可能您无意中在对象之间共享了一个引用,因此
thiss.typer
在所有4种情况下都引用了同一个对象
其次,更可能的是,您创建的随机对象共享相同的种子,因此rand.Next在所有4个实例中返回相同的数字。
如果在没有参数的情况下执行new Random()
,则种子基于当前系统时间。如果你快速连续做多次,种子可能是相同的
您可以尝试使用相同的随机对象,而不是每次使用时都创建一个新对象。这样也可以避免不必要地创建大量对象。+1过去,由于快速连续使用不同的随机对象,我遇到过类似的问题。我在代码中的某个地方有一个静态
Random
对象,任何类都可以访问它。如果有一个静态Random
对象,请记住Random不是线程安全的:默认种子值是从系统时钟派生的,具有有限的分辨率。因此,通过调用默认构造函数连续创建的不同随机对象将具有相同的默认种子值,因此将生成相同的随机数集。通过使用单个随机对象生成所有随机数,可以避免此问题+1不要每次需要使用时都创建一个新的随机数。经常使用同一个。这就是它们的用途。@JonathanDickinson根据我链接到的msdn文章中的评论,最糟糕的情况是,当从不同线程使用Random时,所有后续调用都将返回0!我不认为这是用户所期望的。另请参见此处的注释:。不过,ThreadStatic属性的解决方法不错;)