c++ - mt19937 和 uniform_real_distribution

标签 c++ boost prng mersenne-twister

我正在尝试寻找一种有效的方法来实现统一 (0,1) 分布。由于我必须生成大量样本,因此我选择了 mt19937 作为引擎。我正在使用 boost 库中的版本。我的问题是:使用引擎本身的输出与使用 uniform_real_distribution 有什么区别?

选项#1

std::random_device rd;
boost::mt19937 gen(rd());
boost::random::uniform_real_distribution<double> urand(0, 1);

for ( int i = 0; i < 1E8; i++ ) {
    u = urand(gen);
}

选项#2

std::random_device rd;
boost::mt19937 gen(rd());

for ( int i = 0; i < 1E8; i++ ) {
    u = (double) gen()/gen.max();
}

根据我的测试,就运行时而言,选项 #2 比选项 #1 好得多。我有什么理由应该选择选项 #1 而不是选项 #2?

最佳答案

我不知道 urand() 的底层实现,但是使用除法的结果很可能会在低位产生偏差作为量化效果。如果 gen.max() 不大,则“低位”可能是结果的很多或大部分位。

性能差异可能来自生成正确分布的随机数。如果 double 对您的需求过于精确,那么使用 float 可能会使其运行更高​​效。

关于c++ - mt19937 和 uniform_real_distribution,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27372137/

相关文章:

c++ - 如何使用boost is_class 来判断一个对象是否是一个类?

java - Java 中的默认种子 PRNG

double - 使用 XORShift 生成器生成 double

ios - OS X 的 SecRandomCopyBytes 分支安全吗?

c++ - 如何在qt creator中将QString转换成int

c++ - 如何实现C++代码才能类似于Lua表?

c++ - 如何防止程序退出后控制台输出

C++ 外部存储类生命周期

c++ - boost/ python : How can I use/convert extracted objects?

c++ - 使用正在进行的函数调用销毁对象