2

如果我有两个类,每个类都将伪随机数生成器 (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());
}
4

3 回答 3

5

只要你只有一个线程,最好Random全部使用同一个实例。

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

于 2013-10-20T20:38:41.440 回答
3

不,实际上反过来。

根据 MSDN:随机类

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

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

于 2013-10-20T21:33:12.743 回答
0

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

于 2013-10-20T20:40:52.283 回答