这真的很奇怪,我不明白为什么会这样.在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();
}
}
Run Code Online (Sandbox Code Playgroud)
Guf*_*ffa 121
问题是您正在创建Random类的实例太近.
创建Random对象时,会使用系统时钟中的值播种.如果您Random在时间上创建的实例太近,它们将全部用相同的随机序列播种.
创建单个Random对象并在创建"a"类的实例时将其引用传递给构造函数,而不是Random为每个"a"实例创建一个对象.
您正在创建一个Random非常接近的新实例(您的循环非常紧密),因此每个实例都有效地使用相同的种子值.
更好的方法是创建一个实例并将其传递给您的Count方法.
你可能已经知道了下一点,但为了完整起见我会在这里包含它:
在MSDN对这个细节,但基本上你的问题是Random.Next你使用生成方法:
大于或等于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);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意更改,以给出-1,1而不是-1,0范围内的数字