2015-12-12 111 views
0

我想从反伽玛分布采样使用下面的代码,获取修改我发现在线上的一些代码。 我不是C++编程的专家,所以我需要一些解释和帮助。从反伽玛分布随机生成随机采样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(); 
+0

目前我解决了从伽马分布反转样本,适时重新调整。 – user58058

回答

1

对于其他发行此错误是由使用boost ::数学,而不是提升::随机在variate_generator的实例化而引起的。下面是关于如何创建一个威布尔随机数生成器的例子:

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

我看到,虽然在升压::随机范围gamma分布,没有反伽马分布。

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