关于c#:Random.Next始终返回相同的值

Random.Next returns always the same values

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class a
{
 Random rnd = new Random();
 private void Count()
 {
  int r1 = rnd.Next(-1, 1);
  int r2 = rnd.Next(-1, 1);
 }
}
class b
{
 List listofA=new list();
 foreach (a ACLASS in listofA)
 {
  ACLASS.Count();
 }
}

问题是您创建的Random类的实例时间太近。

当您创建一个Random对象时,它的种子是来自系统时钟的值。如果创建的Random实例时间太近,那么它们都将以相同的随机序列进行种子设定。

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


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

1
2
3
4
5
6
7
8
9
10
11
12
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


您正在创建一个非常紧密的Random新实例(您的循环非常紧密),因此每个实例都有效地使用相同的种子值。

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

您可能知道下一点,但为了完整起见,我将在这里包括它:

msdn对此有详细说明,但基本上您的问题是随机的。您使用的下一个方法生成:

A 32-bit signed integer greater than or equal to minValue and less than maxValue; that is, the range of return values includes minValue but not maxValue. If minValue equals maxValue, minValue is returned.

因此,您的呼叫将返回-1或0。


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