Random.Next总是返回相同的值

这真的很奇怪,我不明白为什么会发生这种情况。 在foreach循环中,我迭代了一个类A集合,并且为每个类调用Count()方法,其中r1r2数字是从范围[-1,1]中生成的。 问题是Random.Next为每个实例返回相同的“随机”数字。 当第一个实例的结果是0和-1时,以下实例将返回相同的结果。 请你能告诉我为什么会这样吗? 另外,我不能在每个类的实例中获得不同的结果。 这是代码:

 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(); } } 

问题是你正在创buildRandom类的实例太接近了。

当你创build一个Random对象的时候,它会被系统时钟的值所接受。 如果你创build的Random实例时间太近了,它们都将被用相同的随机序列播种。

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

你正在创build一个Random非常接近的新实例(你的循环非常紧凑),所以每个实例都有效地使用相同的种子值。

更好的方法是创build一个实例并将其传递给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); } } 

请注意,更改是为了让您的数字范围在-1,1而不是-1,0

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