我正在学习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);
x
,y
值将从另一个类发送到此处。所以,我必须在该类中创建RandomNumberGenerator
的实例,以便我可以调用它的方法并将x和y值传递给它。
class DoStuff
{
RandomNumberGenerator Randomizer = new RandomNumberGenerator
// Here I call a bunch of Randomizer methods that give me values I need
}
上述方法的问题是每次都为所有三个值得到相同的数字。我不确定是不是因为它们如此接近而且Randomizer
的种子值没有时间改变,或者当我创建{{1的新实例时我做错了什么}。class。
我已经在这里经历了一堆答案,通常这样的问题是由于人们在运行方法时创建了许多新的RandomNumberGenerator
对象(因此将所有对象的种子设置为相同的值) ),但我创建的唯一新Random
对象是Random
类。然后我在另一个类中实例化它,这样我就可以传递数据并使用它的方法。
为什么会发生这种情况?我该如何解决这个问题?
答案 0 :(得分:1)
通常,您应该有一个Random
的静态实例,并使用该单个实例获取应用程序的所有随机数。如果要从多个线程中使用它,请务必lock
。
答案 1 :(得分:1)
我认为这是在循环中创建DoStuff
的实例。
当调用太快时,多个随机实例将产生相同的种子,导致相同的数字。
在for循环之外声明它一次或将其传递给方法。
Random r = new Random();
for (int i = 0; i < count; i++)
{
// use the same random instance
}
来自MSDN:
随机数生成从种子值开始。 如果相同 种子被重复使用,生成相同的数字系列。一 产生不同序列的方法是制作种子价值 与时间有关,从而与每个新系列产生不同的系列 随机的实例。默认情况下,无参数构造函数 随机类使用系统时钟生成其种子值,而 它的参数化构造函数可以取基于的Int32值 当前时间的刻度数。但是,因为时钟已经 有限分辨率,使用无参数构造函数创建 紧密连续的不同随机对象创建随机数 产生相同随机数序列的生成器。