繁体   English   中英

生成N个随机整数,总和为R中的M

[英]Generate N random integers that sum to M in R

我想生成N随机正整数,总和为M 我希望在均值为M/N且标准差较小的正态分布附近选择随机正整数(可以将其设置为约束吗?)。

最后,您将如何概括该答案以生成N个随机正数(不仅是整数)?

我发现了其他相关问题,但无法确定如何将其答案应用于这种情况: https : //stats.stackexchange.com/questions/59096/generate-three-random-numbers-that-sum-to-1-输入

生成3个随机数,其总和为R中的1

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
}

对于连续版本,只需使用:

rand_vect_cont <- function(N, M, sd = 1) {
  vec <- rnorm(N, M/N, sd)
  vec / sum(vec) * M
}

例子

rand_vect(3, 50)
# [1] 17 16 17

rand_vect(10, 10, pos.only = FALSE)
# [1]  0  2  3  2  0  0 -1  2  1  1

rand_vect(10, 5, pos.only = TRUE)
# [1] 0 0 0 0 2 0 0 1 2 0

rand_vect_cont(3, 10)
# [1] 2.832636 3.722558 3.444806

rand_vect(10, -1, pos.only = FALSE)
# [1] -1 -1  1 -2  2  1  1  0 -1 -1

只是想出了一种算法,以均匀分布的方式生成N个大于或等于k的随机数,其和为S。 我希望它会在这里有用!

首先,生成介于k和S-k(N-1)之间的N-1个随机数。 按降序对它们进行排序。 然后,对于所有x i ,其中i <= N-2,应用x'i = x i -x i + 1 + k,并且x'N -1 = x N-1 (使用两个缓冲区)。 第N个数字只是S减去所有获得的数量之和。 这具有为所有可能的组合给出相同概率的优点。 如果您想使用正整数,则k = 0(或者可能是1?)。 如果需要实数,请对连续RNG使用相同的方法。 如果您的数字是整数,则可能会担心它们是否等于k。 最好的祝愿!

说明:通过取出其中一个数字,当在(N-1)-空间中表示一个第N个有效数字的所有值组合时,它形成一个单纯形,该空间位于(N-1)-立方体( (N-1)立方体,由随机值范围描述)。 生成它们之后,我们必须将N立方体中的所有点映射到单纯形中的点。 为此,我使用了一种三角剖分方法,该方法涉及所有可能的坐标降序排列。 通过对值进行排序,我们正在映射所有(N-1)! 仅限于其中之一。 我们还必须转换和缩放数字矢量,以使所有坐标都位于[0,1]中,方法是减去k并将结果除以S-kN。 让我们命名新坐标y i

然后,我们通过乘以原始基础的逆矩阵来应用转换,如下所示:

    / 1  1  1 \            / 1 -1  0 \
B = | 0  1  1 |,    B^-1 = | 0  1 -1 |,    Y' = B^-1 Y
    \ 0  0  1 /            \ 0  0  1 /

这给Y” = Y I - ýI + 1。 当我们重新缩放坐标,我们得到:X 'I = Y' (S -千牛)+ K = Y (S -千牛) - Ÿi + 1的 (S -千牛)+ K =(X I - k)的-(x i + 1 -k)+ k = x i -x i + 1 + k,因此具有上述公式。 这适用于除最后一个元素以外的所有元素。

最后,我们应该考虑到这种变换引入概率分布的失真。 实际上,如果我错了,请纠正我,应用于第一个单纯形以获得第二个单纯形的变换不应更改概率分布。 这是证明。

在任何一点上的概率增加是该点周围局部区域的体积增加,因为该区域的大小趋于零,然后除以单纯形的总体积增加。 在这种情况下,两个体积是相同的(只是取基向量的行列式)。 如果区域体积的线性增加始终等于1,则概率分布将相同。我们可以将其计算为变换向量V'= B -1 V相对于V的导数的转置矩阵的行列式,当然是B -1

该行列式的计算非常简单,给出的值为1,这意味着这些点不会以任何方式失真,这会使某些点比其他点更容易出现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM