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

问题描述 投票:8回答:4

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

c++ c++11 random
4个回答
5
投票

没关系。

不共享发电机的原因:

  • 线程化(标准RNG实现不是线程安全的)
  • 随机序列的确定性: 如果您希望能够(用于测试/追踪错误)来控制生成的确切序列,那么通过隔离所使用的RNG可能会减少麻烦,特别是当并非所有RNG消耗都是确定性的时候。

4
投票

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

下面是一个示例:如果要在两个维度(例如x和y)中模拟布朗运动,则需要在两个维度上进行随机性。如果从一个生成器(noise())获取随机数并连续分配它们

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

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

使用不同发电机的另外两个原因请看sehe's答案。


1
投票

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

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


0
投票

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

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