Случайные числа из бета-дистрибутива, 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 часов. Бета-дистрибутив не находится в пакете boost / random, поэтому мне пришлось использовать пакет boost / math / дистрибутивов. Я нашел эта страница на StackOverflow, который предложил решение. Вот он (copy-pasted):

#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, стоит рассмотреть распределение Кумарасвами:

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

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


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