如果我有两个类,每个类都采用伪随机数生成器 (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用于多种目的。