是随机的。 Next 总是返回相同的值

这真的很奇怪,我不明白为什么会这样。在 foreach 循环中,我迭代 A 类集合,对于每个类,我调用 Count()方法,其中从范围[-1,1]生成 r1r2数字。问题是 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();
}
}
71964 次浏览

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

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

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

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

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

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

你可能知道接下来这一点,但为了完整起见,我在这里将其包括在内:

MSDN有这方面的详细信息,但基本上你的问题是你使用的 随机,下一个方法生成:

大于或等于 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的数字的更改