Функция, которая возвращает целое число с определенным распределением

Я ищу распределение или, скорее, функцию, которая возвращает целое число в определенном диапазоне с уменьшением вероятности, чем выше число.

Допустим, диапазон составляет от 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

Кроме того, было бы здорово, если бы вероятности были в соответствии с распределением множеств, скажем, нормально распределенным или экспоненциально распределенным.

Как бы выглядела такая функция?

3 ответа

Решение

Использование

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.

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]))

Пытаться:

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 
Другие вопросы по тегам