Random.Next始终返回相同的值

Tho*_*mas 60 c# random math

这真的很奇怪,我不明白为什么会这样.在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();
 }
}
Run Code Online (Sandbox Code Playgroud)

Guf*_*ffa 121

问题是您正在创建Random类的实例太近.

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

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

  • 我也忘记了,我曾经在同一个问题上回来制作宾果纸盒作为一个俱乐部,那时候,我使用了人类所知道的最糟糕的伎俩:暂停线索为2女士没有经验和疯狂......很疯狂,我有一个类,它创建随机名称,并在所有内容之上使用静态随机声明. (3认同)

Chr*_*isF 9

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

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

你可能已经知道了下一点,但为了完整起见我会在这里包含它:

MSDN对这个细节,但基本上你的问题是Random.Next你使用生成方法:

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

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


tva*_*son 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意更改,以给出-1,1而不是-1,0范围内的数字

  • @johnny当它作为实例变量创建时,`Random`的构造函数会快速连续执行两次.由于它使用当前时间作为种子,这可能导致两个随机数生成器使用相同的伪随机数序列,因此它们都在锁定步骤中返回相同的值.使用单个随机数生成器,在类的静态构造函数中初始化一次,从单个伪随机序列返回不同的数字,给出您期望从随机数生成器获得的行为. (2认同)

Jhe*_*ico 5

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