C# Random.Next总是返回相同的值

C# Random.Next总是返回相同的值,c#,math,random,C#,Math,Random,这真的很奇怪,我不明白为什么会这样。在foreach循环中,我迭代一个类a集合,对于每个类,我调用Count()方法,其中r1和r2数字从范围[-1,1]生成。问题在于Random.Next为每个实例返回相同的“随机”数。当第一个实例的结果为0和-1时,将从以下实例返回相同的结果。拜托,你能告诉我为什么会这样吗?而且,我不能在每个类A实例中得到不同的结果。代码如下: class a { Random rnd = new Random(); private void Count() {

这真的很奇怪,我不明白为什么会这样。在foreach循环中,我迭代一个类a集合,对于每个类,我调用
Count()
方法,其中
r1
r2
数字从范围[-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();
 }
}
a类
{
随机rnd=新随机();
私有无效计数()
{
int r1=rnd.Next(-1,1);
int r2=rnd.Next(-1,1);
}
}
b类
{
List listofA=新列表();
foreach(列表中的ACLASS)
{
ACLASS.Count();
}
}

问题是您创建的
随机类的实例在时间上过于接近

当您创建一个
Random
对象时,它将使用系统时钟中的一个值作为种子。如果创建的
Random
实例在时间上过于接近,则它们都将使用相同的随机序列进行种子设定


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

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

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

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

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

有关于这方面的详细信息,但基本上您的问题是您正在使用的方法生成:

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


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

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

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

我认为在这个范围内,它也可以返回1,并且它们只需要0和-1?@Svante编辑了问题,使间隔打开以匹配代码示例。最初的问题指定了一个封闭的时间间隔,尽管没有使用精确的语言。我认为代码不正确,我将恢复问题以指定一个闭合间隔。@tvanfosson您能告诉我为什么这样做吗?我不明白做这个静力学怎么会给你带来随机性。我知道它有效,但不是为什么。他们在时间上仍然非常接近。谢谢。@johnny当它被创建为实例变量时,
Random
的构造函数会快速连续执行两次。由于它使用当前时间作为种子,这可能导致两个随机数生成器使用相同的伪随机数序列,因此它们在锁步中返回相同的值。使用单个随机数生成器,在类的静态构造函数中初始化一次,从单个伪随机序列返回不同的数字,给出随机数生成器所期望的行为。我也忘了,我以前在为俱乐部制作宾果纸盒时也遇到过同样的问题,我使用了人类所知的最糟糕的技巧:将线程暂停2毫秒,既没有经验又疯狂。。。够疯狂的了,我有一个创建随机名称的类,它在所有东西的顶部都有一个静态随机声明。