首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mt19937和uniform_real_distribution

mt19937和uniform_real_distribution
EN

Stack Overflow用户
提问于 2014-12-09 05:35:34
回答 2查看 1.7K关注 0票数 5

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

选项#1

代码语言:javascript
复制
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

代码语言:javascript
复制
std::random_device rd;
boost::mt19937 gen(rd());

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

从我的测试来看,选项2在运行时方面比选项1要好得多。有什么理由我应该选择选项1而不是选项2?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-10 18:14:15

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

性能差异可能来自于产生适当分布的随机数。如果double对您的需求过于精确,那么也许使用float可以让它更高效地运行。

票数 1
EN

Stack Overflow用户

发布于 2014-12-09 06:20:37

我的问题是:使用引擎本身的输出与使用uniform_real_distribution有什么区别?

在您的第一个选项中,urand()有range [0,1),而第二个选项有range [0,1] (if boost::mt19937::min() == 0,通常包含)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27372137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档