Предполагая, что x
достаточно долго, мы можем положиться на некоторый соответствующий закон больших чисел (также предполагая, что x
достаточно регулярно в некоторых других отношениях).Для этой цели мы будем генерировать значения другой случайной величины Z, принимающей значения в [0,1] и со средним значением perc
.
set.seed(1)
perc <- 50 / 100
x <- sample(1:10000, 1000)
sum(x)
# [1] 5014161
x <- round(x * rbeta(length(x), perc / 3 / (1 - perc), 1 / 3))
sum(x)
# [1] 2550901
sum(x) * 2
# [1] 5101802
sum(x) * 2 / 5014161
# [1] 1.017479 # One percent deviation
Здесь для ZI выбрано определенное бета-распределение, дающее среднее значение perc
,но вы могли бы выбрать и другое.Чем ниже дисперсия, тем точнее результат.Например, следующее намного лучше, поскольку ранее выбранный бета-дистрибутив, по сути, является бимодальным:
set.seed(1)
perc <- 50 / 100
x <- sample(1:1000, 100)
sum(x)
# [1] 49921
x <- round(x * rbeta(length(x), 100 * perc / (1 - perc), 100))
sum(x)
# [1] 24851
sum(x) * 2
# [1] 49702
sum(x) * 2 / 49921
# [1] 0.9956131 # Less than 0.5% deviation!