来自实例化类的相同随机数

我正在学习C#并在我的程序中创建了一个包含随机数生成器的类:

class RandomNumberGenerator { Random RNG = new Random(); // A bunch of methods that use random numbers are in here } 

在这个类中有一些使用RNG的方法。 数据从程序的其他部分发送到此处,进行处理,然后返回。 其中一种方法执行以下操作:

 // Method works something like this int Value1 = RNG.Next(x, y); int Value2 = RNG.Next(x, y); int Value3 = RNG.Next(x, y); 

xy值将从另一个类发送到此处。 所以,我必须在该类中创建一个RandomNumberGenerator的实例,这样我就可以调用它的方法并将x和y值传递给它。

 class DoStuff { RandomNumberGenerator Randomizer = new RandomNumberGenerator // Here I call a bunch of Randomizer methods that give me values I need } 

上述方法的问题是我每次都为所有三个值得到相同的数字。 我不确定是不是因为它们如此接近而且Randomizer的种子值没有时间改变,或者当我创建RandomNumberGenerator类的新实例时我做错了什么。

我已经在这里经历了一堆答案,通常这样的问题是由于人们在运行方法时创建了许多新的Random对象(因此将所有这些对象的种子设置为相同的值),但是唯一的新Random我创建的对象在RandomNumberGenerator类中。 然后我在其他类中实例化一次,这样我就可以传递数据并使用它的方法。

为什么会发生这种情况?我该如何解决这个问题?

通常,您应该有一个Random静态实例,并使用该单个实例获取应用程序的所有随机数。 如果要从多个线程中使用它,请确保lock

我假设在循环中创建DoStuff实例。

当调用太快时,多个随机实例将产生相同的种子,导致相同的数字。

在for循环之外声明它一次或将其传递给方法。

  Random r = new Random(); for (int i = 0; i < count; i++) { // use the same random instance } 

来自MSDN :

随机数生成从种子值开始。 如果重复使用相同的种子,则生成相同的数字序列 。 产生不同序列的一种方法是使种子值与时间相关,从而与每个新的Random实例产生不同的序列。 默认情况下,Random类的无参数构造函数使用系统时钟生成其种子值,而其参数化构造函数可以根据当前时间中的滴答数获取Int32值。 但是,由于时钟具有有限的分辨率,因此使用无参数构造函数以紧密连续的方式创建不同的随机对象会创建随机数生成器,从而生成相同的随机数序列。