Я думаю, что вы сделали две маленькие ошибки.
- В 4 это должно быть P = (nx) * p * P / ( (x + 1) * (1-p) ) поэтому (1-p) находится в знаменателе, а не в числителе.
- U - одно случайное число, но вы создаете
n
различных случайных чисел, используя runif(n)
.Вот почему вы получаете предупреждение.
Итак, вот исправленный алгоритм:
varBinom<-function(n, p)
{
U <- runif(1)
x <- 0
P <- (1-p)^n
FF <- P
for(i in 1:n)
{
if(U<FF) return(x)
P <- (n-x) * p * P/((x+1)*(1-p))
FF <- FF+P
x <- x+1
}
return(x)
}
Вот результат, когда вы вызываете функцию 15 раз:
set.seed(1)
replicate(15, varBinom(10, 1/2))
[1] 4 4 5 7 4 7 7 6 6 3 4 4 6 5 6