这真的很奇怪,我不明白为什么会这样。在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();
}
}
答案 0 :(得分:115)
问题是您正在及时创建Random
类的实例。
创建Random
对象时,会使用系统时钟中的值播种。如果您创建Random
个实例的时间太近,它们将全部播放相同的随机序列。
创建单个Random
对象,并在创建“a”类的实例时将其引用传递给构造函数,而不是为每个“a”实例创建一个Random
对象。
答案 1 :(得分:9)
你正在创建一个非常接近的Random
的新实例(你的循环非常紧张),所以每个实例都有效地使用相同的种子值。
更好的方法是创建一个实例并将其传递给Count
方法。
你可以清楚地知道下一点,但为了完整起见我会把它包括在内:
MSDN有详细信息,但基本上您的问题是您使用的Random.Next方法生成:
大于或等于minValue且小于maxValue的32位有符号整数;也就是说,返回值的范围包括minValue但不包括maxValue。如果minValue等于maxValue,则返回minValue。
因此你的调用将返回-1或0。
答案 2 :(得分: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);
}
}
请注意更改以提供-1,1而不是-1,0
范围内的数字答案 3 :(得分:5)
为每个A实例包含一个随机实例。听起来他们都获得了相同的默认种子值。您可能希望为所有A实例创建静态随机并重复使用它,或者为A构造函数中的Random()实例提供种子值。