我使用这段代码生成3个随机数,加上72:

# https://stackoverflow.com/questions/24845909/generate-n-random-integers-that-sum-to-m-in-r
rand_vect <- function(N, M, sd = 1, pos.only = TRUE) {
    vec <- rnorm(N, M/N, sd)
    if (abs(sum(vec)) < 0.01) vec <- vec + 1
    vec <- round(vec / sum(vec) * M)
    deviation <- M - sum(vec)
    for (. in seq_len(abs(deviation))) {
        vec[i] <- vec[i <- sample(N, 1)] + sign(deviation)
    }
    if (pos.only) while (any(vec < 0)) {
        negs <- vec < 0
        pos  <- vec > 0
        vec[negs][i] <- vec[negs][i <- sample(sum(negs), 1)] + 1
        vec[pos][i]  <- vec[pos ][i <- sample(sum(pos ), 1)] - 1
    }
    vec
}

如果我运行这个代码100次:

results <- list()

for (i in 1:100)

{

r_i = rand_vect(3,72)

results[[i]] <- r_i


}

当我看到公布的数字时:

[[1]]
[1] 23 24 25

[[2]]
[1] 25 24 23

[[3]]
[1] 24 25 23

[[4]]
[1] 23 24 25

[[5]]
[1] 25 24 23

[[6]]
[1] 24 24 24

[[7]]
[1] 24 25 23

[[8]]
[1] 24 25 23

[[9]]
[1] 24 25 23

[[10]]
[1] 24 23 25

在每一次迭代中,所有的数字都会像预期的那样增加到72——但这些数字并不是真的"看起来那么随机".它们似乎都"聚集"在"24、23、25"周围.我希望在这些数字中看到更多的"随机性".例如:

[[11]] [1] 5 50 17

[[12]] [1] 12 40 20

  • 为什么我正在使用的代码中的数字"聚集"在24、23、25左右?我如何更改上述代码,以便生成的数字中有更多的"随机性"?

非常感谢.

推荐答案

如果你只想要三个随机整数,总和为72,你可以做如下的事情

diff(c(0, sort(sample(72, 2)), 72))

R相关问答推荐

使用case_when和Mutate搜索多个列以寻找条件

如何创建构成多个独立列条目列表的收件箱框列?

删除facet_wrap标签之间的水平线

寻找图片边缘

更改Heatmap Annotation对象的名称

MCMC和零事件二元逻辑回归

抖动点与嵌套类别变量箱形图的位置不对齐

如何编辑ggplot的图例字使用自定义对象(gtable)?'

整数成随机顺序与约束R?

在数学中正确显示摄氏度、开氏度或华氏度

将嵌套列表子集化为嵌套列表

用关联字符串替换列名的元素

在嵌套列表中查找元素路径的最佳方法

如何在R中描绘#符号?

根据类别合并(汇总)某些行

`lazy_dt`不支持`dplyr/across`?

使用`Watch()`和`renderUI()`时,不再满足仍出现在SHILINY AFTER条件中的条件输入

防止在更新SHINY中的Reactive Value的部分内容时触发依赖事件

如何筛选截止年份之前最后一个测量年度的所有观测值以及截止年份之后所有年份的所有观测值

ArrangeGrob()和类似的替代方法不接受Grob列表.在Grid.Draw,返回:glist中的错误(...):仅允许在glist";中使用Grobs;