2010-11-15 3 views
7

Я пытаюсь использовать Boost для генерации случайных чисел в соответствии с бета-распределением с использованием C++. Я видел много примеров онлайн для генерации случайных чисел в соответствии с распределениями в random.hpp (например, this book). Однако я не мог перевести их на использование бета-дистрибутива, найденного в beta.hpp.Создание случайного числа на основе бета-распределения с использованием Boost

Спасибо.

ответ

13

Сначала вы хотите нарисовать случайное число равномерно из диапазона (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); 
+0

Спасибо! Прекрасно работает. –

+1

По-видимому, это популярный ответ, поэтому я добавлю оговорку: для некоторых дистрибутивов у вас может быть функция квантилирования, которая почти вертикальна в определенных точках, и в этом случае вы можете столкнуться с численными/разрешающими проблемами, Пронумерованный номер плавающей запятой 'randFromUnif' не имеет достаточного разрешения для генерации случайных чисел при передаче через квантиль: вы должны получить квантованные выходные значения. Поэтому знайте свой проблемный домен и свою функцию квантиля, чтобы убедиться, что вы это знаете! – btown

Смежные вопросы