Сначала вы хотите нарисовать случайное число равномерно из диапазона (0,1). При любом распространении вы можете подключить это число к функции квантилирования дистрибутива, и результат будет таким, как если бы случайное значение было извлечено из дистрибутива. Из here:
общий метод для генерации случайных чисел из произвольного распределения, которое имеет CDF без скачков является использование обратной функции к КОР: G (у) = Р^{- 1} (у) , Если u (1), ..., u (n) - случайные числа из равномерного на (0,1) распределения, то G (u (1)), ..., G (u (n)) является случайным образец из распределения с cdf F (x).
Как мы можем получить функцию квантилирования для бета-распределения? Документация для beta.hpp: here. Вы должны использовать что-то вроде этого:
#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);
Спасибо! Прекрасно работает. –
По-видимому, это популярный ответ, поэтому я добавлю оговорку: для некоторых дистрибутивов у вас может быть функция квантилирования, которая почти вертикальна в определенных точках, и в этом случае вы можете столкнуться с численными/разрешающими проблемами, Пронумерованный номер плавающей запятой 'randFromUnif' не имеет достаточного разрешения для генерации случайных чисел при передаче через квантиль: вы должны получить квантованные выходные значения. Поэтому знайте свой проблемный домен и свою функцию квантиля, чтобы убедиться, что вы это знаете! – btown