Random.Next returns always the same values
这真的很奇怪,我不明白为什么会这样。在for each循环中,我正在迭代一个类A集合,对于每个类,我调用Count()方法,其中r1和r2数字是从范围[-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对象。
- 我也忘了,我以前在为俱乐部制作宾果纸盒的时候也有同样的问题,那时候,我用了人类所知道的最糟糕的伎俩:暂停线2毫秒。缺乏经验和疯狂……太疯狂了,我有一个类,它创建随机名称,并在所有内容之上附加静态随机声明。
对类的所有实例使用单个静态随机数生成器。
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
- 我认为在这个范围内,它也可以返回1,它们只需要0和-1?
- @svante编辑了问题,使间隔打开以匹配代码示例。最初的问题指定了一个封闭的时间间隔,尽管没有使用精确的语言。我认为代码不正确,将恢复问题以指定一个关闭的间隔。
- @Tvanfosson你能告诉我为什么这个有效吗?我不明白做这些静态数据是如何给你带来随机性的。我知道这是可行的,但不是为什么。他们的时间仍然非常接近。谢谢。
- @当它被创建为一个实例变量时,Random的构造函数将连续快速执行两次。因为它使用当前时间作为种子,这会导致两个随机数生成器使用相同的伪随机数序列,因此它们都会在锁步中返回相同的值。使用在类的静态构造函数中初始化一次的单个随机数生成器,从单个伪随机序列返回不同的数字,给出您期望从随机数生成器得到的行为。
您正在创建一个非常紧密的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()实例提供一个种子值。