Я написал симуляцию на C++, которая генерирует (1 000 000)^2 числа из определенного распределения вероятности, а затем делает с ними что-то. До сих пор я использовал экспоненциальные, нормальные, гамма, униформные и пуассоновские распределения. Вот код для одного из них:Случайные числа из бета-дистрибутива, C++
#include <boost/random.hpp>
...main...
srand(time(NULL)) ;
seed = rand();
boost::random::mt19937 igen(seed) ;
boost::random::variate_generator<boost::random::mt19937, boost::random::normal_distribution<> >
norm_dist(igen, boost::random::normal_distribution<>(mu,sigma)) ;
Теперь мне нужно запустить его для распространения бета-версии. Все распределения, которые я сделал до сих пор, заняли 10-15 часов. Бета-дистрибутив не находится в пакете boost/random, поэтому мне пришлось использовать пакет boost/math/distribution. Я нашел this page on StackOverflow, который предложил решение. Здесь это (скопировано):
#include <boost/math/distributions.hpp>
using namespace boost::math;
double alpha, beta, randFromUnif;
//parameters and the random value on (0,1) you drew
beta_distribution<> dist(alpha, beta);
double randFromDist = quantile(dist, randFromUnif);
Я воспроизвел его, и это сработало. Оценки времени выполнения моего моделирования являются линейными и точно предсказуемыми. Говорят, что это будет работать в течение 25 дней. Я вижу две возможности: 1. предложенный метод не уступает той, которую я использовал ранее для других распределений 2. Распределение Бета просто гораздо сложнее для генерации случайных чисел из
Голые в виду, что у меня есть ниже минимальной понимание C++-кодирования, поэтому вопросы, которые я задаю, могут быть глупыми. Я не могу дождаться месяца для завершения этой симуляции, так что я могу сделать, чтобы улучшить это? Возможно, используйте начальный метод, который я использовал и модифицировал для работы с пакетом boost/math/distribution? Я даже не знаю, возможно ли это.
Другая полезная информация состоит в том, что параметры одинаковы для всех (1 000 000)^2 чисел, которые мне нужно сгенерировать. Я говорю это, потому что у дистрибутива Beta есть неприятный PDF-файл, и, возможно, знание того, что параметры исправлены, может каким-то образом использоваться для упрощения процесса? Просто случайное предположение.
Спасибо, я не знал об этом имуществе. Я также использовал тот факт, что гамма-распределение - это всего лишь сумма экспонент. Ваше предложение изменило время работы от 600 до 40 часов. Спасибо! – jaff
Используя стандартную нотацию, это не должно быть Gamma (α, 1) и Gamma (β, 1) вместо Gamma (1, α) и Gamma (1, β). То есть α и β должны быть параметрами формы, а не масштабными параметрами. – BenRI
@BenRI - Существует несколько способов параметризации гамма-распределения. Одним из наиболее широко используемых является 'gamma (shape_factor, scale_factor)', и с этим использованием вы правы. Этот масштабный коэффициент также может быть нормой или средним значением. Другие определяют форму как второй аргумент (но это, по-видимому, не так широко используется). Я обновляю свой ответ, чтобы отразить более общую нотацию и указать, что аргумент формы является ключом. –