在多个类中使用一个Random对象是否会减少每个类的随机对象?

时间:2013-10-20 20:28:26

标签: c# 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());
}

3 个答案:

答案 0 :(得分:4)

只要您只有一个帖子,最好全部使用相同的Random个实例。

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

答案 1 :(得分:2)

不,实际上是另一种方式。

根据MSDN:Random Class

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

该页面还表示不保证所有实例成员都是线程安全的。

答案 2 :(得分:0)

如果您打算做一些像关联减少的相关归纳策略这样的事情,那么需要在复制过程中同步您的随机性,如果您使用PRNG的单独实例则更容易。但如果您只是进行直接采样,可以将相同的PRNG用于多种用途。