Random.Next总是返回相同的值。

10 浏览
0 Comments

Random.Next总是返回相同的值。

这真的很奇怪,我不明白为什么会发生这种情况。在 foreach 循环中,我正在遍历一个类 A 的集合,并为每个类调用 Count() 方法,其中 r1r2 是从范围 [-1,1] 生成的数字。问题是,Random.Next 对于每个实例返回相同的“随机”数。当第一个实例的结果为 0 和 -1 时,后续实例将返回相同的结果。请问,您能告诉我为什么会发生这种情况吗?另外,我无法在每个类 A 实例中获得不同的结果。以下是代码:\n

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();
 }
}

0
0 Comments

问题的出现原因是在循环中创建了多个Random实例,这些实例非常接近,所以每个实例实际上使用相同的种子值。解决方法是创建一个实例,并将其传递给Count方法。

为了完整起见,我将包括下面的说明:

MSDN上有关于这个问题的详细信息,但基本上你的问题是你正在使用的Random.Next方法生成:

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

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

0
0 Comments

(Random.Next返回始终相同的值)问题的出现原因是在创建Random实例变量时,构造函数会在很短的时间内连续执行两次。由于构造函数使用当前时间作为种子,这可能导致两个随机数生成器使用相同的伪随机数序列,因此它们会以同步的方式返回相同的值。为了解决这个问题,我们可以使用一个单独的静态Random数生成器,通过在类的静态构造函数中初始化它,从单个伪随机序列中返回不同的数字,以获得我们从随机数生成器中期望的行为。

例如,我们可以使用以下代码来解决这个问题:

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);
  }
}

通过将Random实例变量声明为静态,并在静态构造函数中初始化它,我们确保了只有一个随机数生成器被创建,并且在整个类的所有实例中被共享。这样做可以避免多个随机数生成器使用相同的伪随机数序列的问题,从而使得Random.Next返回不同的值。

0
0 Comments

问题的出现原因是在很短的时间内创建了多个Random类的实例。当创建一个Random对象时,它会使用系统时钟的一个值作为种子。如果在很短的时间内创建多个Random实例,它们将使用相同的随机序列作为种子。

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

作者还提到自己曾经遇到过相同的问题,当时为一个俱乐部制作Bingo Cartons,并使用了一个最糟糕的技巧:暂停线程2毫秒。这是一个不成熟和疯狂的做法。作者还提到有一个类,在顶部声明了一个静态的Random变量,用于创建随机名称。

因此,解决这个问题的方法是创建一个单独的Random对象,并在需要使用随机数的地方共享该对象的引用,而不是在短时间内创建多个Random实例。

0