给定以下算法,如果随机输入值u小于(累积)prob向量中的某个预定义概率,则该算法返回预定义枚举中的值
val <- 1:5
prob <- c(1/3,1/30,2/15,7/30,4/15)
u <- runif(1)
if (u<prob[1])
{
x=val[1]
} else if(u<prob[1]+prob[2])
{
x=val[2]
} else if(u<prob[1]+prob[2]+prob[3])
{
x=val[3]
} else if (u<prob[1]+prob[2]+prob[3]+prob[4])
{
x=val[4]
} else
x=val[5]
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让这一切变得更有效率?我不知道如何以不同的方式做到这一点。
另一种选择是使用findInterval. 例如
val <- 1:5
prob <- c(1/3,1/30,2/15,7/30,4/15)
u <- runif(1)
val[findInterval(u, cumsum(c(0, prob)))]
Run Code Online (Sandbox Code Playgroud)
这也适用于任意数量的值
u <- runif(1000)
val[findInterval(u, cumsum(c(0, prob)))]
Run Code Online (Sandbox Code Playgroud)