Function that returns integer with specific distribution

孤街浪徒 提交于 2019-12-13 04:57:53

问题


I am looking for a distribution or rather a function that returns an integer in a specific range with decreasing probability the higher the number.

Lets say the range is from 1 to 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

Additionally it would be great if the probabilities are according to a set distribution say normal distributed or exponentially distributed.

What would a function like this look like?


回答1:


Use

sample.int(n, size = 1, prob = p) 

where for the probabilities you could use something like

p <- exp(-(1:n))

or make use of the standard normal distribution

p <- dnorm(1:n)

Edit For your specific example use

n <- 5
p <- c(0.85, 0.08, 0.04, 0.02, 0.01)



回答2:


Not very efficient, and assumes that you can make sure that the cumsum adds up to 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]))



回答3:


Try:

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) will return values by the given distribution. For more samples at a time:

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

You can check the distribution by:

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 


来源:https://stackoverflow.com/questions/25783133/function-that-returns-integer-with-specific-distribution

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!