Я пытаюсь сделать выборку из обратного гамма-распределения, используя следующий код, получить модифицирующий код, который я нашел в сети.
Я не специалист по кодированию на 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();
Для других дистрибутивов эта ошибка вызвана использованием boost :: math вместо boost :: random в вашем экземпляре 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 :: random есть гамма-распределение, обратного гамма-распределения нет.
У меня установлен Boost 1.60.0 и в нем есть папка \ boost_1_60_0 \ libs \ math \ test \, в которой есть некоторый код, который может вам помочь.
Других решений пока нет …