首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用boost在C++-11中封装随机数发生器

用boost在C++-11中封装随机数发生器
EN

Stack Overflow用户
提问于 2015-07-14 21:46:08
回答 1查看 1.1K关注 0票数 1

我试图在C++-11中使用boost生成随机数.我看到了一些关于这方面的很好的文章,我能够生成随机数,把我所有的代码都放在主函数中,就像这个网页(http://www.sitmo.com/article/generating-random-numbers-in-c-with-boost/)中所建议的那样。

但是,我无法封装可以由不同函数调用的随机数生成器(RNG)。我希望这个封装的RNG作为参数接收数字范围和一个随机种子。我试着按照这篇文章(Boost随机数发生器)的建议去做。

我实现了下面的代码。但它在两个方面都失败了:随机种子的变化和取值范围的定义。

代码语言:javascript
复制
#include <boost/random/variate_generator.hpp>
#include <boost/generator_iterator.hpp>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/normal_distribution.hpp>

typedef boost::mt19937                     ENG;    // Mersenne Twister
typedef boost::normal_distribution<double> DIST;   // Normal Distribution
typedef boost::variate_generator<ENG,DIST> GEN;    // Variate generator

class RNG {

  private:
     ENG eng;
     DIST dist;

  public:
     GEN gen;
     RNG(double min,double max,int seed)
     : dist(min,max), gen(eng,dist)
     {eng.seed(seed); }
};

这是我的主要功能。

代码语言:javascript
复制
int main(int argc, char **argv){
    if(argc == 2){
        int myseed = atoi(argv[1]);
        double minimum = 1.;
        double maximum = 10.;
        int N = 20;

        RNG myrn(minimum,maximum,myseed);

        for (int i = 0; i < N; i++){
            std::cout << myrn.gen() << std::endl;
        }
            return 0;
    }
    exit(1);
}

该实现与我使用的种子无关,生成相同的随机数序列。此外,随机数并不在最小和最大之间。你们中有人知道如何解决这两个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-14 22:07:03

boost::variate_generator通过值获取它的构造函数参数,所以当您在mem初始化器列表中传递一个默认构造的mt19937时,它会复制它。在构造函数体内播种引擎对该副本没有任何影响。若要解决此问题,请将模板参数类型更改为引用。

代码语言:javascript
复制
typedef boost::variate_generator<ENG&,DIST> GEN;
//                                  ^

接下来,我认为您不需要normal_distribution,它的构造函数参数不是分布产生的值范围的最小和最大值,而是分布的均值和标准差。

您可能要寻找的发行版是uniform_real_distribution

代码语言:javascript
复制
typedef boost::random::uniform_real_distribution<> DIST;

在进行了这些修复之后,您的代码应该按照您的意愿运行。

现场演示

使用C++11编译器,您甚至不需要Boost就可以完成这个任务,头提供了所需的所有组件。唯一显著的区别是缺少一个variate_generator类,相反,当您想要生成一个随机数时,可以使用引擎作为参数调用分发对象。

代码语言:javascript
复制
#include <random>

typedef std::mt19937                     ENG;    // Mersenne Twister
typedef std::uniform_real_distribution<> DIST;   // Uniform Distribution

class RNG {

  private:
     ENG eng;
     DIST dist;

  public:
     DIST::result_type gen() { return dist(eng); }
     RNG(double min,double max,int seed)
     : dist(min,max)
     {eng.seed(seed); }
};

现场演示

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

https://stackoverflow.com/questions/31417957

复制
相关文章

相似问题

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