我正在寻找一个分布或者更确切地说是一个返回特定范围内整数的函数,概率越小,数字越大。
让我们说范围从1到5。
85% of the time the function should return 1
8% of the time the function should return 2
4% of the time the function should return 3
2% of the time the function should return 4
1% of the time the function should return 5
此外,如果概率是根据正态分布或指数分布的集合分布,那将是很好的。
这样的功能会是什么样的?
答案 0 :(得分:0)
使用
sample.int(n, size = 1, prob = p)
您可以使用
之类的概率p <- exp(-(1:n))
或使用标准正态分布
p <- dnorm(1:n)
修改强> 对于您的具体示例,请使用
n <- 5
p <- c(0.85, 0.08, 0.04, 0.02, 0.01)
答案 1 :(得分:0)
效率不高,并且假设您可以确保cumsum最多为1。
reqProb = c(0.85,0.08,0.04,0.02,0.01)
nRandom = 100
# unlist(lapply(runif(nRandom,0,1),function(x) min(which(x<cumsum(reqProb)))))
unlist(lapply(runif(nRandom,0,1),function(x) which(x<cumsum(reqProb))[1]))
答案 2 :(得分:0)
尝试:
nums = 1:5
prob = c(85,8,4,2,1)
xx = list()
for(i in 1:5) xx[[length(xx)+1]] = rep(nums[i], prob[i])
xx = unlist(xx)
xx
sample(xx,1)
[1] 1
sample(xx,1)将返回给定分布的值。一次获取更多样本:
sample(xx, 25)
[1] 1 1 1 1 1 1 1 1 1 1 1 3 1 2 1 1 1 5 1 1 1 1 1 3 1
您可以通过以下方式检查分发:
table(sample(xx, 100))
1 2 3 4 5
85 8 4 2 1
>
>
table(sample(xx, 100, replace=T))
1 2 3 4 5
82 8 6 2 2