用约束生成R中的随机数

时间:2018-05-15 06:21:27

标签: r random

如何在R中生成两组具有不同设置大小的随机数,其中两组的总和彼此相等? 例如,我想生成两组名为X和Y的随机数

X <- runif(15, min=0, max=20)
Y <- runif(10, min=0, max=20)

,约束

sum(X) == sum(Y)

2 个答案:

答案 0 :(得分:1)

你可以使用一种拒绝抽样:

a <- 15
b <- 10

set.seed(42) #for reproducibility
n <- 0 #counter
repeat {
  n <- n + 1
  X <- runif(a, min=0, max=20)
  Y <- runif(b - 1, min=0, max=20)
  d <- sum(X) - sum(Y)
  if (d >= 0 && d<= 20) break
}
Y <- c(Y, d)

sum(X) == sum(Y)
#[1] TRUE

n
#[1] 11

可能存在更高效的算法。我也不确定你的应用程序是否具有正确的随机性(无论可能是什么),特别是关于Y的最后一个值(即d)。也许在stats.stackexchange.com或math.stackexchange.com上询问。

答案 1 :(得分:0)

我认为以下情况也应该是好的。由于我们知道unwrapX中的元素相比必须包含10个较小的元素,因此似乎不需要拒绝。

Y

算法说明。

  1. 生成两个较小长度的矢量
  2. 确定一笔金额较大的a <- 15 b <- 10 set.seed(42) tmp1 <- runif(b, min=0, max=20) tmp2 <- runif(b, min=0, max=20) if (sum(tmp1) > sum(tmp2)) { Y <- tmp1 X <- tmp2 } else { Y <- tmp2 X <- tmp1 } X <- c(X, runif(a - b, min=0, max=20)) if (sum(X) >= sum(Y)) { yind <- sample.int(b, 1) Y[yind] <- sum(X) - sum(Y[-yind]) } else { xind <- sample.int(a, 1) X[xind] <- sum(Y) - sum(X[-xind]) } sum(X) == sum(Y) # [1] TRUE ,因为它更短。
  3. 生成Y
  4. 的剩余部分
  5. 如果X,请随机选择sum(X) > sum(Y)的元素并生成Y,如果没有为此选择sum(X) = sum(Y)的元素。