Performance 随机数,C++;11对增压 我想在C++中生成伪随机数,这两种可能的选择是C++ 11和Boost对应的特征。它们的使用方式基本相同,但在我的测试中,本地版本的速度大约慢4倍

Performance 随机数,C++;11对增压 我想在C++中生成伪随机数,这两种可能的选择是C++ 11和Boost对应的特征。它们的使用方式基本相同,但在我的测试中,本地版本的速度大约慢4倍,performance,boost,c++11,random,Performance,Boost,C++11,Random,这是因为库中的设计选择,还是我缺少某种禁用调试代码的方法 更新:代码如下: cerr << "boost::bernoulli_distribution ... \ttime = "; s=0; t=time(); boost::bernoulli_distribution<> dist(.5); boost::mt19937 boostengine; for (int i=0; i<n; ++i) s += dist(boostengine); cerr

这是因为库中的设计选择,还是我缺少某种禁用调试代码的方法

更新:代码如下:

cerr << "boost::bernoulli_distribution ...      \ttime = ";
s=0; t=time();
boost::bernoulli_distribution<> dist(.5);
boost::mt19937 boostengine;
for (int i=0; i<n; ++i) s += dist(boostengine);
cerr << time()-t << ",  \tsum = " << s << endl;

cerr << "C++11 style ...                        \ttime = ";
s=0; t=time();
std::bernoulli_distribution dist2(.5);
std::mt19937_64 engine;
for (int i=0; i<n; ++i) s += dist2(engine);
cerr << time()-t << ",  \tsum = " << s << endl;
cerr相当可怕

我们来看看,

boost::伯努利分布

__detail::_Adaptor<_UniformRandomNumberGenerator, double> __aurng(__urng);
if ((__aurng() - __aurng.min()) < __p.p() * (__aurng.max() - __aurng.min()))
    return true;
return false;
if(_p==RealType(0))
返回false;
其他的

返回RealType(eng()-(eng.min)()是的,这可能是个好主意。更新,谢谢。小心,mt19937和mt19937_64是不同的RNG。Mersenne twister非常简单,我不确定是否有空间让它慢4倍。您应该尝试对发行版进行基准测试。@CoryNelson很公平,但在我的应用程序中,两者的执行速度大致相同test@CoryNelson与其说我关心发动机,不如说我关心分配。所示的两个版本中的每一个都是我能找到的在任一框架中生成Bernoulli变量的最快版本。抛掷伯努利硬币应该比运行梅森龙卷风更简单……哎哟!我想从代码中删除boost依赖项,但我想这不是一个好主意。除非我在std::mt19937的基础上实现自己的伯努利分布。。。在这种情况下,很难(对我来说)真正理解完全参数化的模板代码的意义,我相信每个人都在使用默认值或专用库。我学到的越多,我就越尊重boost中的所有工作。好的,我这样做了:
class local_bernoulli_分布{public:explicit local_bernoulli_分布(double p=0.5):thr(p*unsigned(-1)){}bool操作符()(std::mt19937&e){return e()略好于标准(1.5s对2.0s),但没有达到提升(.5s)的水平。那就是了!我真的不明白你对»完全参数化模板代码«的意思。这里的区别在于,libstdc++的发行版仅仅是
\u适配器
的包装,而boost有一个直接的实现。如果使用
模板内联bool operator()(Engine&e)
,则可以提高增压速度。尽管如此,还是最好使用boost。注意:
std::generate\u canonical
使用尽可能多的生成器循环来生成目标类型。该示例使用了
bernoulli_分布
,该分布使用了
double
(53位尾数),因此需要使用8位生成器进行7个生成器周期(使用32位生成器进行2个周期)。当然,这里的额外精度被浪费了,但是技术上,统一的C++等价于更精确。
__detail::_Adaptor<_UniformRandomNumberGenerator, double> __aurng(__urng);
if ((__aurng() - __aurng.min()) < __p.p() * (__aurng.max() - __aurng.min()))
    return true;
return false;