我试图找到一种有效的方法来实现统一的(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?
发布于 2014-12-10 18:14:15
我不知道urand()的基本实现,但是使用除法的结果可能会在低阶位中产生偏差作为量化效果。如果gen.max()不是很大,那么“低阶位”可能是非常多或大部分的结果位。
性能差异可能来自于产生适当分布的随机数。如果double对您的需求过于精确,那么也许使用float可以让它更高效地运行。
发布于 2014-12-09 06:20:37
我的问题是:使用引擎本身的输出与使用uniform_real_distribution有什么区别?
在您的第一个选项中,urand()有range [0,1),而第二个选项有range [0,1] (if boost::mt19937::min() == 0,通常包含)。
https://stackoverflow.com/questions/27372137
复制相似问题