Случайные числа из бета-распределения, C++

Я написал симуляцию на C++, которая генерирует (1 000 000)^2 чисел из определенного распределения вероятностей, а затем что-то делает с ними. До сих пор я использовал экспоненциальное, нормальное, гамма, равномерное и пуассоновское распределения. Вот код для одного из них:

#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 часов. Дистрибутив Beta отсутствует в пакете boost/random, поэтому мне пришлось использовать пакет boost/math/distributions. Я нашел эту страницу на Stackru, которая предложила решение. Вот оно (скопировано):

#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/distributions? Я даже не знаю, возможно ли это.

Другая полезная информация заключается в том, что параметры одинаковы для всех (1 000 000)^2 чисел, которые мне нужно сгенерировать. Я говорю это потому, что бета-дистрибутив имеет неприятный PDF и, возможно, знание того, что параметры зафиксированы, может каким-то образом использоваться для упрощения процесса? Просто случайное предположение.

3 ответа

Решение

Бета-распределение связано с гамма-распределением. Пусть X - случайное число, полученное из гаммы (α,1), а Y - из гаммы (β,1), где первым аргументом гамма-распределения является параметр формы. Тогда Z=X/(X+Y) имеет распределение Beta(α,β). С этим преобразованием это займет всего вдвое больше времени, чем ваш тест гамма-распределения.

Примечание. Приведенное выше предположение предполагает наиболее распространенное представление гамма-распределения, гамма (форма, масштаб). Имейте в виду, что различные реализации генератора случайных чисел гамма-распределения будут варьироваться в зависимости от значения и порядка аргументов.

Если вам нужен дистрибутив, который очень похож на бета-версию, но имеет очень простой обратный CDF закрытой формы, стоит рассмотреть дистрибутив Kumaraswamy:

http://en.wikipedia.org/wiki/Kumaraswamy_distribution

Он используется в качестве альтернативы бета-распределению, когда быстро требуется большое количество случайных выборок.

Попробуйте скомпилировать с оптимизацией. Использование флага -O3 обычно ускоряет процесс. См. Этот пост о флагах оптимизации или этот обзор для более подробной информации.

Другие вопросы по тегам