在c ++ 11中使用一个随机引擎进行多分布
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在c ++ 11中使用一个随机引擎进行多分布相关的知识,希望对你有一定的参考价值。
我在我的应用程序中使用c ++ 11新的<random>
头文件,并且在不同方法的一个类中,我需要具有不同分布的不同随机数。我只是将一个随机引擎std::default_random_engine
作为类成员种子在类构造函数中使用std::random_device
并将其用于我的方法中的不同发行版。以这种方式使用随机引擎是可以的,或者我应该为我使用的每个分发声明不同的引擎。
没关系。
不共享发电机的原因:
- 线程化(标准RNG实现不是线程安全的)
- 随机序列的确定性: 如果您希望能够(用于测试/追踪错误)来控制生成的确切序列,那么通过隔离所使用的RNG可能会减少麻烦,特别是当并非所有RNG消耗都是确定性的时候。
将一个伪随机数生成器用于不同的随机变量时应该小心,因为这样做会使它们变得相关。
下面是一个示例:如果要在两个维度(例如x和y)中模拟布朗运动,则需要在两个维度上进行随机性。如果从一个生成器(noise())获取随机数并连续分配它们
while(simulating)
x = x + noise()
y = y + noise()
然后变量x和y变得相关,因为伪数生成器的算法只会生成它们有多好的陈述,如果你生成每一个生成的数字,而不是像本例中那样每一秒生成一个。这里,布朗粒子可能以比在负方向上更高的概率移动到正x和y方向,从而引入人工漂移。
使用不同发电机的另外两个原因请看sehe's答案。
MosteM的答案不正确。只要您希望分布中的绘制是独立的,这样做是正确的。如果由于某种原因,您需要完全相同的随机输入到不同分布的绘制,那么您可能需要不同的RNG。如果你想要两个随机变量之间的相关性,最好从一个使用数学原理的公共随机变量开始构建它们:例如,如果A,B是独立的法线(0,1),那么A和aA + sqrt(1-a * * 2)B是正常的(0,1),相关性为a。
编辑:我在C ++ 11随机库上找到了一个很棒的resource,可能对你有用。
没有理由不这样做。根据您使用的随机发生器,周期非常大(在Mersenne-Twister的情况下为2 ^ 19937),因此在大多数情况下,您甚至不会在执行程序期间达到一个周期的结束。即使没有这样说,使用相同的发生器到达所有分布的时间比使用3个发生器每个进行1/3的周期更糟糕。
在我的程序中,我为每个线程使用一个生成器,它工作正常。我认为这是他们在C ++ 11中拆分生成器和发行版的主要原因,因为如果你不允许这样做,那么将发生器和发行版分开是没有好处的,如果需要一个发生器无论如何每个分配。
以上是关于在c ++ 11中使用一个随机引擎进行多分布的主要内容,如果未能解决你的问题,请参考以下文章