我有以下算法(基于this algorithm)
据我所知,在r
上将是
varBinom<-function(n,p)
{
U<-runif(n)
x<-0
P<-(1-p)^n
FF<-P
for(i in 1:n)
{
if(U<FF)
{
X<-x
break
}
P<-(n-x)*p*P/(x+1)*(1-p)
FF<-FF+P
x<-x+1
}
return(x)
}
但是,在编译代码时,我收到十条警告消息,他们都说:
警告消息:1:如果(U
1 并且只会使用第一个元素
为什么会这样? 我该如何修复代码?
答案 0 :(得分:1)
我认为您犯了两个小错误。
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