C++ 基于OpenMP的并行均匀分布伪随机数

C++ 基于OpenMP的并行均匀分布伪随机数,c++,boost,random,openmp,C++,Boost,Random,Openmp,我在我的程序中使用0和1之间的boost均匀分布: #include <boost/random/uniform_01.hpp> #include <boost/random.hpp> static boost::mt19937 rng; static boost::uniform_01<boost::mt19937&> zeroone(rng); 问题是,是否可以使用OpenMP并行for循环,并且不损坏均匀分布伪随机数生成器 e、 g.

我在我的程序中使用0和1之间的boost均匀分布:

 #include <boost/random/uniform_01.hpp>
 #include <boost/random.hpp>

 static boost::mt19937 rng;
 static boost::uniform_01<boost::mt19937&> zeroone(rng);
问题是,是否可以使用OpenMP并行
for循环
,并且不损坏均匀分布伪随机数生成器

e、 g.是否可以为第一个核心定义一个种子,为第二个核心定义第一个核心伪随机数生成器在6次之后将到达的相应种子


你可以按你的建议去做,但是

  • 这将是疯狂的……效率极低(因为RNG的目的是生成难以预测的伪随机序列,预测第n个后继序列的唯一方法也是生成中间序列。)
  • 很可能是不必要的:
  • 您可以为每个线程提供它自己的私有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);
    
         // ...
    }
    
    typedef boost::。。。。rng_t;
    静态rng\u t g\u rng;//注意你怎么从不播种,这是故意的吗?
    #每线程
    {
    rng_t rng(g_rng());//此处需要同步访问g_rng
    增压:均匀_01零点(rng);
    // ...
    }
    
    <代码> > P>我的C++随机数库的文档,包含RandomLib 在OpenMP中使用并行数字流的说明;看见 . 你可能是
    能够根据您的应用程序调整此处提出的想法。

    您是否需要根据RNG的初始种子确定行为?我认为随机数生成器通常是线程安全的,你不一定能重新创建相同的数字序列。@Kerrek:boost随机数生成器不是线程安全的;还要注意,如果您(a)播种相同的值(b)将循环分块,那么我的方法将启用Deterministic结果deterministically@sehe:你所说的“非线程安全”是什么意思?程序真的会完全崩溃吗,或者这仅仅是指结果的可预测性吗?@Kerrek SB:正如我在过去意外地亲眼目睹的那样,该计划能够而且将完全实现crash@sehe:我明白了。很高兴知道,很抱歉我的索赔被破坏了!你知道C++0x中新的
    吗,但是,它是一样的吗?@Luc Danton:+1为了简单:)@sehe,我可以使用
    rng.seed(一些数字)
    ,因为我使用
    mt19937&
    。@Eagle:微妙!我错过了。好办法that@sehe,假设我遵循您的想法,因此在每个线程中我将具有统一的分布编号。问题是,若我把它和所有系统进行比较,它还会接近均匀分布吗?鹰:事实上,我认为你们应该是偏执狂。优秀的程序员懒惰且偏执:)
    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);
    
         // ...
    }