Генерировать N случайных целых чисел, которые суммируются с M в R

Я хотел бы сгенерировать N случайные положительные целые числа, которые суммируются с M. Я хотел бы, чтобы случайные положительные целые числа были выбраны вокруг довольно нормального распределения, среднее значение которого M/N, с небольшим стандартным отклонением (можно ли установить это как ограничение?).

Наконец, как бы вы обобщили ответ для генерации N случайных положительных чисел (а не только целых чисел)?

Я нашел другие соответствующие вопросы, но не смог определить, как применять их ответы в этом контексте: https://stats.stackexchange.com/info/59096/generate-three-random-numbers-that-sum-to-1-in-r

Сгенерируйте 3 случайных числа, сумма которых равна 1 в R

R - случайное приближенное нормальное распределение целых чисел с предопределенным итогом

Ответ 1

Normalize.

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