在数组中生成随机值,直到R中达到总值[重复]

hjzp0vay  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(94)
    • 此问题在此处已有答案**:

Generate N random integers that sum to M in R(3个答案)
8小时前关门了。
我想创建一个数组,然后为每个位置赋值,直到数组中的值之和等于给定的总和,一旦达到最大值,数组的其余部分可以为0,所以开始时:

years <- 20 # total length of array

N <- array(0, years) # make array

tot <- 10 # Total I want to stop at

max.size <- 3 # maximum value to put in the array

因此,结果可能类似于:N = c(1,3,0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0)
我认为while语句会起作用,类似于this question,但不确定如何到达那里。而且,我认为this question有我需要的部分,但我很难将它们放入我的上下文中。

random.sample <- function(x) {  repeat {
# do something
i <- sample(0:max.size, 1)
x <- i
# exit if the condition is met
if (sum(x) == tot) break } return(x) }        
random.sample(N)

谢谢你的时间。

roejwanj

roejwanj1#

一个使用cumsumifelse的简单函数就可以完成这项工作,而不需要代价高昂的循环。

f <- function(len, tot, max.size) {
  x <- sample(0:max.size, len, replace = TRUE)
  res <- ifelse(cumsum(x) > tot, 0, x)

  if(sum(res) < tot) {
    res[(cumsum(res) == sum(res)) & res == 0][1] <- tot - sum(res)
  }
  res
}

测试

f(len = 20, tot = 10, max.size = 3)
#> [1] 3 3 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

相关问题