首页 > 解决方案 > R - 在具有平均值的区间内生成值

问题描述

如何在区间 [1:5] 内生成一组随机值,​​平均值为 1.8?我试过样本,但不知道如何包含平均值.. rpois 不断返回零值

标签: r

解决方案


如果您谈论的是整数 1:5,那么 Poisson 是一个合理的选择。只需将 lambda 设置为 0.8 并添加 1:

set.seed(1)
x <- rpois(2000, 0.8) + 1
x <- x[x < 6]
mean(x)
#> [1] 1.784677
min(x)
#> [1] 1
max(x)
#> [1] 5
head(x, 30)
#> [1] 1 1 2 3 1 3 3 2 2 1 1 1 2 1 2 2 2 5 1 2 3 1 2 1 1 1 1 1 3 1
hist(x, breaks = 30)

在此处输入图像描述 如果您希望均值恰好为1.8,那么您并不是真的在抽取随机样本,但应该可以切换一些数字以获得一组或多或少符合您标准的随机数:

x <- sample(c(2, x[-which(x == 1)[1:38]]))
mean(x)
#> [1] 1.8

如果您想要任何实数值,您可以尝试使用伽马分布的相同技巧:

set.seed(1)
x <- rgamma(1000, 2, 2.5) + 1
mean(x)
#> [1] 1.794942
max(x)
#> [1] 4.918468
min(x)
#> [1] 1.013304
head(x, 30)
#>  [1] 1.332346 2.428303 2.385268 1.820325 2.554164 2.016216
#>  [7] 1.915227 1.459717 1.272409 1.334249 1.462368 1.578189
#> [13] 1.242602 2.069755 1.926223 2.134657 2.044341 1.637085
#> [19] 2.543066 2.249806 1.309245 1.388618 1.490084 1.550701
#> [25] 1.324007 1.115011 2.184496 1.408031 2.259906 2.032122
hist(x, breaks = 30)

在此处输入图像描述

调整其中一些数字以给出精确为 1.8 的真实均值会更加困难(尽管并非不可能)。


推荐阅读