Мне нужно быстро генерировать множество случайных чисел из биномиальных распределений для сильно разных размеров проб (большинство, однако, будет небольшим). Я надеялся не кодировать алгоритм вручную (см., Например, this related discussion from November), потому что я начинающий программист и не люблю изобретать колеса. Похоже, Boost не подает генератор для биномиально распределенных вариантов, но TR1 и GSL do. Есть ли веская причина выбрать один над другим, или лучше ли я написать что-то настроенное для моей ситуации? Я не знаю, имеет ли это смысл, но я буду чередовать генерацию чисел из равномерных распределений и биномиальных распределений по всей программе, и я бы хотел, чтобы они делили одно и то же семя и минимизировали накладные расходы. Мне бы понравились некоторые советы или примеры того, что я должен рассматривать.Случайные числа из биномиального распределения
ответ
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
Вы неправильно понять модель Boost - вы выбираете случайный тип номер генератора, а затем распределение, на котором для распространения значения RNG производит больше. В this answer есть очень простой пример, который использует равномерное распределение, но в других дистрибутивах используется один и тот же базовый шаблон - генератор и распределение полностью развязаны.
Хе-хе, я так недостаточно быстро для Boost. Спасибо, что объяснил, что он делает. – Sarah
См. [Генератор случайных чисел на случайных ошибках] (http://stackoverflow.com/questions/2775578/biased-random-number-generator/) для обсуждения неравномерных PRNG. Тем не менее, он не отвечает на ваш вопрос напрямую, и ваша ссылка «Ноябрь» также выглядит актуальной. –
Ссылка «Biassed ...» снова ссылается на библиотеки Boost, которые, как представляется, не имеют PRNG для биномиальных распределений. В ноябрьской ссылке приводятся несколько приближений. Исходя из эффективных и высококачественных PRNG из биномиальных распределений, где количество испытаний может сильно варьироваться, я понимаю, что-то вроде математической задачи. Я надеялся, что библиотека уже существует, которая может обрабатывать все эти сценарии. Похоже, мне, возможно, придется самому тестировать TR1 и GSL - надеялся, что у других здесь может быть опыт работы с ними. – Sarah