使用boost C ++从反伽马分布生成随机样本

时间:2015-12-12 13:37:53

标签: c++ boost gamma-distribution

我尝试使用以下代码从反伽马分布中进行采样,获取修改我在线找到的一些代码。 我不是C ++编码专家,所以我需要一些解释和帮助。

#include <iostream>
#include <fstream>
#include <random>
#include "boost/random.hpp"
#include "boost/generator_iterator.hpp"
#include <boost/math/distributions.hpp>

using namespace std;

int main(){

    boost::mt19937 rng; 
    boost::math::inverse_gamma_distribution<>invg(2.0, 3.0);
    cout << "  probability variance > 50: " << boost::math::cdf(boost::math::complement(invg, 50.0));

    boost::variate_generator<boost::mt19937& , boost::math::inverse_gamma_distribution<> > sampleIG(rng, invg);


      for (int i = 0; i < 10; ++i)
      {
        double d = sampleIG();
        std::cout << d << std::endl;
      }
}

我得到的错误是:

In file included from /usr/include/boost/random.hpp:55:0,
                 from vesSimQ.cpp:5:
/usr/include/boost/random/variate_generator.hpp: In instantiation of ‘class boost::random::variate_generator<boost::random::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u>&, boost::math::inverse_gamma_distribution<double> >’:
vesSimQ.cpp:20:98:   required from here
/usr/include/boost/random/variate_generator.hpp:59:48: error: no type named ‘result_type’ in ‘class boost::math::inverse_gamma_distribution<double>’
     typedef typename Distribution::result_type result_type;
                                                ^
vesSimQ.cpp: In function ‘int main()’:
vesSimQ.cpp:25:26: error: no match for call to ‘(boost::random::variate_generator<boost::random::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u>&, boost::math::inverse_gamma_distribution<double> >) ()’
      double d = sampleIG();

1 个答案:

答案 0 :(得分:1)

对于其他发行版,此错误是由variate_generator实例化中使用boost :: math而不是boost :: random引起的。以下是如何创建Weibull随机数生成器的示例:

#include <boost/random/mersenne_twister.hpp>        // For boost::mt19937
#include <boost/random/variate_generator.hpp>
#include <boost/random/weibull_distribution.hpp>

int main(){
    double shape = 3.0;
    double scale = 0.5;

    boost::mt19937 rng(12);
    boost::random::weibull_distribution<> myWeibull(shape, scale);
    boost::random::variate_generator<boost::mt19937&, boost::random::weibull_distribution<> > rand_Weibull(rng, myWeibull);
    double rn;
    for (int i=0; i < 10; ++i)
    {
        rn = rand_Weibull();
        cout << rn << endl;
    }
}

我看到虽然在boost :: random范围内有一个gamma分布,但没有反伽马分布。

我安装了Boost 1.60.0并且它有一个名为\ boost_1_60_0 \ libs \ math \ test \的文件夹,其中有一些代码可以帮助你。