C++ 基于OpenMP的并行均匀分布伪随机数
我在我的程序中使用0和1之间的boost均匀分布: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.
#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次之后将到达的相应种子
你可以按你的建议去做,但是
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);
// ...
}