2015-12-12 4 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

Для других распределений этой ошибка вызвана использования наддува :: математики вместо подталкивания :: случайное в вашей конкретизации 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; 
    } 
} 

Я вижу, что, хотя есть гамма-распределение в форсированиях :: случайных областей видимости нет обратных гамма-распределения.

У меня установлен Boost 1.60.0, и у него есть папка под названием \ boost_1_60_0 \ libs \ math \ test \, у которой есть код, который может вам помочь.