在c ++ 11中使用一个随机引擎进行多分布

时间:2012-03-26 10:32:58

标签: c++ c++11 random

我在我的应用程序中使用c ++ 11新<random>标头,并且在不同方法的一个类中,我需要具有不同分布的不同随机数。我只是将一个随机引擎std::default_random_engine作为类成员将其置于具有std::random_device的类构造函数中,并将其用于我的方法中的不同分布。以这种方式使用随机引擎是可以的,或者我应该为我使用的每个分发声明不同的引擎。

4 个答案:

答案 0 :(得分:5)

没关系。

不共享发电机的原因:

  • 线程化(标准RNG实现不是线程安全的)
  • 随机序列的确定性:

    如果您希望能够(用于测试/追踪错误)控制生成的确切序列,通过隔离所使用的RNG可能会减少麻烦,特别是当并非所有RNG消耗都是确定性的时候。

    < / LI>

答案 1 :(得分:4)

对于不同的随机变量使用一个伪随机数生成器时应该小心,因为这样做会使它们变得相关。

这是一个例子:如果你想在两个维度(例如x和y)模拟布朗运动,你需要在两个维度上随机。如果从一个生成器中取随机数(noise())并连续分配它们

while(simulating)
    x = x + noise()
    y = y + noise()

然后变量x和y变得相关,因为伪数生成器的算法只会生成它们有多好的陈述,如果你生成每一个数字而不是像这个例子中那样每一秒生成一个数字。在这里,布朗粒子可能以比在负方向上更高的概率向正x和y方向移动,从而引入人工漂移。

使用不同生成器的另外两个原因是sehe's回答。

答案 2 :(得分:1)

MosteM的回答是不正确的。只要您希望分布中的绘制是独立的,这样做是正确的。如果由于某种原因,您需要完全相同的随机输入到不同分布的绘制,那么您可能需要不同的RNG。如果你想要两个随机变量之间的相关性,最好从一个使用数学原理的公共随机变量开始构建它们:例如,如果A,B是独立的法线(0,1),那么A和aA + sqrt(1-a * * 2)B是正常的(0,1),具有相关性a。

编辑:我在C ++ 11随机库上发现了一个很棒的resource,可能对你有用。

答案 3 :(得分:0)

没有理由不这样做。根据您使用的随机发生器,周期非常大(在Mersenne-Twister的情况下为2 ^ 19937),因此在大多数情况下,您甚至不会在执行程序期间达到一个周期的结束。即使没有这样说,使用相同的发电机到达所有发电机组的时间比使用3台发电机的时间要好1/3还要差。

在我的程序中,我为每个线程使用一个生成器,它工作正常。我认为这是他们在C ++ 11中拆分生成器和发行版的主要原因,因为如果你不允许这样做,那么将发生器和发行版分开是没有好处的,如果需要一个发生器无论如何,每个分发。