Маловероятно, что функция Uniform(0, 1) вернет 0. И (практически) невероятно, что это произойдет два раза подряд. Тем не менее, вопрос хороший.
В приложенном коде я не обрабатывал опасные ситуации, дабы сделать его более понятным. Можете обратить внимание на функцию PoissonKnuth и увидеть, что произойдет, если Uniform(0, 1) вернет 0. Во избежание подобных казусов можно использовать в качестве базового генератора функцию, возвращающую натуральные числа, начиная с 1. Тогда функция Uniform(0,1) = BasicRandGenerator() / RAND_MAX будет генерировать числа в диапазоне (0, 1], что будет считаться эквивалентным распределением почти всюду.
Не то, на чем бы я хотел акцентировать внимание в этой статье. Включен ли 0 или включен ли 1 в генерации равномерно распределенной величины не имеет большого значения. Всегда можно обработать непредвиденные ситуации. Я лишь пытался рассказать о быстрых алгоритмах для разных распределений
> Не то, на чем бы я хотел акцентировать внимание в этой статье.
Это как раз понятно, просто больше придраться было не к чему. А на подобные грабли я лично наступал, правда в другом генераторе. Вероятность такого события мала, зато генератор вызывается много раз, а одно отсутствующее значение может испортить весь долгий расчёт.
алгоритм, использующий лишь одну равномерно распределенную случайную величину
Прикольно, но при q=p зациклится на U=1… А есть где-нибудь объяснение этой формулы под спойлером для тех, кому не повезло с преподом по мат.статистике? Спасибо
Генераторы дискретно распределенных случайных величин