gpt4 book ai didi

c++ - 使用 boost 在 C++-11 中封装随机数生成器

转载 作者:行者123 更新时间:2023-11-30 03:51:12 24 4
gpt4 key购买 nike

我正在尝试使用 boost 在 C++-11 中生成随机数。我看过一些关于此的不错的帖子,并且我能够生成随机数,将我的所有代码放在主要函数中,如本网页 (http://www.sitmo.com/article/generating-random-numbers-in-c-with-boost/) 中所建议的那样。

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

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

#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); }
};

这是我的主要功能。

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);
}

此实现独立于我使用的种子生成相同的随机数序列。此外,随机数不在最小值和最大值之间的范围内。你们有人知道如何解决这两个问题吗?

最佳答案

boost::variate_generator 按值获取其构造函数参数,因此当您将默认构造的 mt19937 传递给它时在 mem-initializer 列表中,它制作了它的拷贝。在构造函数的主体中播种引擎对该拷贝没有影响。要解决此问题,请将模板参数类型更改为引用。

typedef boost::variate_generator<ENG&,DIST> GEN;
// ^

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

您可能要查找的分布是 uniform_real_distribution .

typedef boost::random::uniform_real_distribution<> DIST;

进行这些修复后,您的代码应该会如您所愿地运行。

Live demo


使用 C++11 编译器,您甚至不需要 Boost 来执行此操作, <random> header 提供了您需要的所有组件。唯一显着的区别是缺少 variate_generator类,而是在您想要生成随机数时使用引擎作为参数调用分布对象。

#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); }
};

Live demo

关于c++ - 使用 boost 在 C++-11 中封装随机数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31417957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com