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

时间:2012-11-03 22:42:22

标签: c# random

我正在学习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的种子值没有时间改变,或者当我创建{{1的新实例时我做错了什么}。class。

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

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

2 个答案:

答案 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值   当前时间的刻度数。但是,因为时钟已经   有限分辨率,使用无参数构造函数创建   紧密连续的不同随机对象创建随机数   产生相同随机数序列的生成器。