Random.Next总是返回相同的值。
Random.Next总是返回相同的值。
这真的很奇怪,我不明白为什么会发生这种情况。在 foreach 循环中,我正在遍历一个类 A 的集合,并为每个类调用 Count()
方法,其中 r1
和 r2
是从范围 [-1,1] 生成的数字。问题是,Random.Next
对于每个实例返回相同的“随机”数。当第一个实例的结果为 0 和 -1 时,后续实例将返回相同的结果。请问,您能告诉我为什么会发生这种情况吗?另外,我无法在每个类 A 实例中获得不同的结果。以下是代码:\n
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
实例,这些实例非常接近,所以每个实例实际上使用相同的种子值。解决方法是创建一个实例,并将其传递给Count
方法。
为了完整起见,我将包括下面的说明:
MSDN上有关于这个问题的详细信息,但基本上你的问题是你正在使用的Random.Next方法生成:
返回大于等于minValue并且小于maxValue的32位有符号整数;即返回值的范围包括minValue但不包括maxValue。如果minValue等于maxValue,则返回minValue。
因此,你的调用将返回-1或0。
(Random.Next返回始终相同的值)问题的出现原因是在创建Random实例变量时,构造函数会在很短的时间内连续执行两次。由于构造函数使用当前时间作为种子,这可能导致两个随机数生成器使用相同的伪随机数序列,因此它们会以同步的方式返回相同的值。为了解决这个问题,我们可以使用一个单独的静态Random数生成器,通过在类的静态构造函数中初始化它,从单个伪随机序列中返回不同的数字,以获得我们从随机数生成器中期望的行为。
例如,我们可以使用以下代码来解决这个问题:
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); } }
通过将Random实例变量声明为静态,并在静态构造函数中初始化它,我们确保了只有一个随机数生成器被创建,并且在整个类的所有实例中被共享。这样做可以避免多个随机数生成器使用相同的伪随机数序列的问题,从而使得Random.Next返回不同的值。
问题的出现原因是在很短的时间内创建了多个Random类的实例。当创建一个Random对象时,它会使用系统时钟的一个值作为种子。如果在很短的时间内创建多个Random实例,它们将使用相同的随机序列作为种子。
解决方法是创建一个单独的Random对象,并在创建"a"类的实例时将其引用传递给构造函数,而不是为每个"a"实例创建一个Random对象。
作者还提到自己曾经遇到过相同的问题,当时为一个俱乐部制作Bingo Cartons,并使用了一个最糟糕的技巧:暂停线程2毫秒。这是一个不成熟和疯狂的做法。作者还提到有一个类,在顶部声明了一个静态的Random变量,用于创建随机名称。
因此,解决这个问题的方法是创建一个单独的Random对象,并在需要使用随机数的地方共享该对象的引用,而不是在短时间内创建多个Random实例。