在多个类中使用一个 Random 对象是否会降低每个类的随机性



如果我有两个类,每个类都采用伪随机数生成器 (PRNG) 作为依赖项,并且我将相同的 PRNG 实例传递给这两个类,这是否会损害 PRNG 算法?例如,在下面的代码中,每个类最终在 while 循环中使用相同序列的所有其他随机数,因为它们共享相同的生成器。每个类获得一个单独的实例更合适还是重要?

Random rand = new Random();
RandomBool randBool = new RandomBool(rand);
RandomFirstName randFirstName = new RandomBool(rand);
while(<condition>)
{
    bool myBool = randBool.Next();
    string myName = randFirstName.Next();
    Console.WriteLine(myName + " " + myBool.ToString());
}

只要只有一个线程,最好始终使用相同的Random实例。

(如果是多线程应用程序,请锁定或每个线程有一个实例; Random不适用于多线程。

不,实际上相反。

根据 MSDN:随机类

"[...]这个问题[相同生成的序列]可以通过创建单个随机对象而不是多个对象来避免。为了提高性能,请创建一个随机对象以随着时间的推移生成许多随机数,而不是重复创建新的随机对象来生成一个随机数。

该页面还说,不能保证任何实例成员都是线程安全的。

如果您打算做一些花哨的事情,例如减少方差的相关归纳策略,则需要在复制之间同步随机性,并且如果您使用单独的 PRNG 实例,则要容易得多。 但是,如果您只是进行直接采样,则可以将同一PRNG用于多种目的。

相关内容

最新更新