Случайные числа из биномиального распределения

Мне нужно быстро сгенерировать множество случайных чисел из биномиальных распределений для существенно разных размеров проб (однако большинство из них будут небольшими). Я надеялся, что мне не придется кодировать алгоритм вручную (см., Например, это обсуждение в ноябре), потому что я начинающий программист и не люблю изобретать колеса. Похоже, что Boost не предоставляет генератор для биномиально распределенных переменных, но TR1 и GSL сделать. Есть ли веская причина выбрать одно вместо другого или лучше написать что-нибудь, адаптированное к моей ситуации? Я не знаю, имеет ли это смысл, но я буду чередовать генерацию чисел из равномерных распределений и биномиальных распределений по всей программе, и я бы хотел, чтобы они разделяли одно и то же семя и минимизировали накладные расходы. Я хотел бы получить несколько советов или примеров того, что мне следует обдумать.


person Sarah    schedule 07.05.2010    source источник
comment
См. Генератор смещенных случайных чисел для обсуждения неоднородных ГПСЧ. Однако он не дает прямого ответа на ваш вопрос, и ваша ссылка «ноябрь» тоже выглядит актуальной.   -  person Jonathan Leffler    schedule 08.05.2010
comment
Ссылка Biassed ... снова относится к библиотекам Boost, которые, похоже, не имеют PRNG для биномиальных распределений. Ноябрьская ссылка дает несколько приблизительных значений. Насколько я понимаю, создание эффективных и высококачественных ГПСЧ из биномиальных распределений, где количество испытаний может сильно различаться, является чем-то вроде математической задачи. Я надеялся, что уже существует библиотека, способная обрабатывать все эти сценарии. Похоже, мне, возможно, придется самому протестировать TR1 и GSL - я надеялся, что у других, возможно, уже есть опыт работы с ними.   -  person Sarah    schedule 08.05.2010


Ответы (2)


Повышение 1,43, похоже, поддерживает биномиальные распределения. Вы можете использовать boost::variate_generator, чтобы связать источник случайности с типом распределения, из которого вы хотите выполнить выборку.

Таким образом, ваш код может выглядеть примерно так (отказ от ответственности: не тестировался!):

boost::mt19937 rng;                 // produces randomness out of thin air
                                    // see pseudo-random number generators
const int n = 20;
const double p = 0.5;
boost::binomial<> my_binomial(n,p);      // binomial distribution with n=20, p=0.5
                                         // see random number distributions
boost::variate_generator<boost::mt19937&, boost::binomial<> >
         next_value(rng, my_binomial);     // glues randomness with mapping
int x = next_value();                      // simulate flipping a fair coin 20 times
person Jim Lewis    schedule 07.05.2010
comment
Если я правильно понимаю, он на самом деле не поддерживает ГПСЧ из этих дистрибутивов. Он вычисляет функции вероятности и кумулятивной массы и тому подобное. - person Sarah; 08.05.2010
comment
Ага, теперь я понял. Спасибо - ваш пример полезен. - person Sarah; 08.05.2010

Вы неправильно понимаете модель Boost - вы выбираете тип генератора случайных чисел, а затем распределение, по которому распределяете значения, производимые ГСЧ. В этом ответе есть очень простой пример, в котором используется унифицированный дистрибутив, но в других дистрибутивах используется та же основная схема - генератор и распределение полностью развязаны.

person Community    schedule 07.05.2010
comment
Хех, я настолько не быстр для Boost. Спасибо, что объяснили, что он делает. - person Sarah; 08.05.2010