1

我正在学习 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我唯一的新对象create 在RandomNumberGenerator类内。然后我在另一个类中实例化一次,这样我就可以向它传递数据并使用它的方法。

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

4

2 回答 2

1

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

于 2012-11-03T22:44:51.737 回答
1

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

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

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

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

来自MSDN

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

于 2012-11-03T22:46:36.740 回答