我在我的程序中使用0和1之间的均匀分布:
#include <boost/random/uniform_01.hpp>
#include <boost/random.hpp>
static boost::mt19937 rng;
static boost::uniform_01<boost::mt19937&> zeroone(rng);
使用OpenMP在for-loop中调用 zeroone()
函数,我希望并行。
for ( int index = 0 ; index < 4096 ; index++ ) {
if ( node[ index ] == false ) {
if ( zeroone() < 0.03 )
node[ index ] = true;
}
}
是否可以使用OpenMP并行for-loop
并且不损坏统一分布伪随机数生成器?
e.g。是否有可能为第一个核心定义一个种子,第二个核心是第一个核心伪随机数发生器在6次后达到的相应种子?
此致
答案 0 :(得分:2)
你可以做你的建议,但
您可以为每个线程提供自己的私有RNG(独立种子)。除非您的数据集非常小,否则均匀分布属性仍将保持不变(在这种情况下,无论线程如何,均匀性都会被样本噪声淹没)
我的计划看起来像这样:
typedef boost::.... rng_t;
static rng_t g_rng; // notice how you never seed this, is this on purpose?
#per thread
{
rng_t rng(g_rng()); // need synchronized access to g_rng here
boost::uniform_01<boost::mt19937&> zeroone(rng);
// ...
}
答案 1 :(得分:0)
我的C ++随机数库RandomLib的文档包含 在OpenMP中使用并行数字流的说明;看到 http://randomlib.sourceforge.net/html/parallel.html。你可能是 能够使那里提出的想法适应您的应用。