如何在R中生成两组具有不同设置大小的随机数,其中两组的总和彼此相等? 例如,我想生成两组名为X和Y的随机数
X <- runif(15, min=0, max=20)
Y <- runif(10, min=0, max=20)
,约束
sum(X) == sum(Y)
答案 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)
我认为以下情况也应该是好的。由于我们知道unwrap
与X
中的元素相比必须包含10个较小的元素,因此似乎不需要拒绝。
Y
算法说明。
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
,因为它更短。Y
X
,请随机选择sum(X) > sum(Y)
的元素并生成Y
,如果没有为此选择sum(X) = sum(Y)
的元素。