Вы получаете целочисленное переполнение.Попробуйте
set.seed(0)
rpois(1, 1e+8)
#[1] 100012629
rpois(1, 1e+9)
#[1] 999989683
rpois(1, 1e+10)
#[1] NA
#Warning message:
#In rpois(1, 1e+10) : NAs produced
Как только lambda
станет слишком большим, 32-разрядное представление целого числа будет недостаточным и будет возвращено NA
.(Напомним, что пуассоновские случайные величины являются целыми числами).
Ваш цикл имеет динамический рост на rate
(lambda
), который в конечном итоге может стать слишком большим.Выполнение вашей функции с меньшим minutes
, скажем 10
, хорошо.
В отличие от этого, ppois
и dpois
, которые производят числа с плавающей запятой двойной точности, подходят для больших lambda
.
dpois(1e+8, 1e+8)
#[1] 3.989423e-05
dpois(1e+9, 1e+9)
#[1] 1.261566e-05
dpois(1e+10, 1e+10)
#[1] 3.989423e-06
dpois(1e+11, 1e+11)
#[1] 1.261566e-06
ppois(1e+8, 1e+8)
#[1] 0.5000266
ppois(1e+9, 1e+9)
#[1] 0.5000084
ppois(1e+10, 1e+10)
#[1] 0.5000027
ppois(1e+11, 1e+11)
#[1] 0.5000008
С каждой минутой параметр скорости увеличивается на x%
, где x
- случайное значение из равномерного распределения на интервале [0, 5]
.
rate
увеличивается на x%
, а не x
.Поэтому вы должны использовать
rate <- rate * (1 + runif(1, 0, 5) / 100)