【发布时间】:2015-02-06 22:38:27
【问题描述】:
我正在尝试找到一种有效的方法来实现统一 (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?
【问题讨论】:
-
不看实现本身就不可能确定,但我假设
uniform_real_distribution使用更多位来确保可以返回范围内的每个可能的浮点结果。选项 #2 的孔间距为1/gen.max()。
标签: c++ boost prng mersenne-twister