2010-05-07 5 views
4

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

+0

См. [Генератор случайных чисел на случайных ошибках] (http://stackoverflow.com/questions/2775578/biased-random-number-generator/) для обсуждения неравномерных PRNG. Тем не менее, он не отвечает на ваш вопрос напрямую, и ваша ссылка «Ноябрь» также выглядит актуальной. –

+0

Ссылка «Biassed ...» снова ссылается на библиотеки Boost, которые, как представляется, не имеют PRNG для биномиальных распределений. В ноябрьской ссылке приводятся несколько приближений. Исходя из эффективных и высококачественных PRNG из биномиальных распределений, где количество испытаний может сильно варьироваться, я понимаю, что-то вроде математической задачи. Я надеялся, что библиотека уже существует, которая может обрабатывать все эти сценарии. Похоже, мне, возможно, придется самому тестировать TR1 и GSL - надеялся, что у других здесь может быть опыт работы с ними. – Sarah

ответ

6

Boost 1.43, как представляется, поддерживает binomial distributions. Вы можете использовать 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 
+0

Если я правильно понимаю, это фактически не поддерживает PRNG из этих дистрибутивов. Он вычисляет вероятности и кумулятивные функции массы и тому подобное. – Sarah

+0

Gah, теперь я понял. Спасибо, ваш пример полезен. – Sarah

2

Вы неправильно понять модель Boost - вы выбираете случайный тип номер генератора, а затем распределение, на котором для распространения значения RNG производит больше. В this answer есть очень простой пример, который использует равномерное распределение, но в других дистрибутивах используется один и тот же базовый шаблон - генератор и распределение полностью развязаны.

+0

Хе-хе, я так недостаточно быстро для Boost. Спасибо, что объяснил, что он делает. – Sarah

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

  • Нет связанных вопросов^_^