Random.Next始终返回相同的值

时间:2009-10-31 16:41:02

标签: c# math random

这真的很奇怪,我不明白为什么会这样。在foreach循环中,我正在迭代A类集合,并且对于每个类,我调用Count()方法,其中r1r2数字是从范围[-1, 1]。问题是Random.Next为每个实例返回相同的“随机”数字。当第一个实例的结果为0和-1时,将从以下实例返回相同的结果。拜托,你能告诉我为什么会这样吗?另外,我在每个A类实例中都得不到不同的结果。这是代码:

class a
{
 Random rnd = new Random();
 private void Count()
 {
  int r1 = rnd.Next(-1, 1);
  int r2 = rnd.Next(-1, 1);
 }
}
class b
{
 List<a> listofA=new list<a>();
 foreach (a ACLASS in listofA)
 {
  ACLASS.Count();
 }
}

4 个答案:

答案 0 :(得分:115)

问题是您正在及时创建Random类的实例。

创建Random对象时,会使用系统时钟中的值播种。如果您创建Random个实例的时间太近,它们将全部播放相同的随机序列。

创建单个Random对象,并在创建“a”类的实例时将其引用传递给构造函数,而不是为每个“a”实例创建一个Random对象。

答案 1 :(得分:9)

你正在创建一个非常接近的Random的新实例(你的循环非常紧张),所以每个实例都有效地使用相同的种子值。

更好的方法是创建一个实例并将其传递给Count方法。

你可以清楚地知道下一点,但为了完整起见我会把它包括在内:

MSDN有详细信息,但基本上您的问题是您使用的Random.Next方法生成:

  

大于或等于minValue且小于maxValue的32位有符号整数;也就是说,返回值的范围包括minValue但不包括maxValue。如果minValue等于maxValue,则返回minValue。

因此你的调用将返回-1或0。

答案 2 :(得分:9)

对该类的所有实例使用单个静态随机数生成器。

class a
{
  private static Random rnd;
  static a() {
      rnd = new Random();
  }
  private void Count()
  {
    int r1 = rnd.Next(-1, 2);
    int r2 = rnd.Next(-1, 2);
  }
}

请注意更改以提供-1,1而不是-1,0

范围内的数字

答案 3 :(得分:5)

为每个A实例包含一个随机实例。听起来他们都获得了相同的默认种子值。您可能希望为所有A实例创建静态随机并重复使用它,或者为A构造函数中的Random()实例提供种子值。