【问题标题】:Generate random numbers in R with constraint [duplicate]在R中生成带有约束的随机数[重复]
【发布时间】:2018-10-24 21:25:09
【问题描述】:

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

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

有一个约束

sum(X) == sum(Y)

【问题讨论】:

  • 您可能对以下内容感兴趣:mathworks.com/matlabcentral/fileexchange/…
  • 有人可以解释为什么这是链接答案的副本吗? This question has been asked before and already has an answer. - 这不是真的! @loki

标签: r random


【解决方案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 上询问。

【讨论】:

    【解决方案2】:

    我认为以下内容也应该不错。由于我们知道XY 中的元素相比必须包含10 个更小的元素,因此似乎没有必要拒绝。

    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
    

    算法说明。

    1. 生成两个长度较短的向量
    2. 将总和较大的分配给Y,因为它更短。
    3. 生成X 的剩余部分
    4. 如果是sum(X) &gt; sum(Y),则随机选择Y的一个元素,生成sum(X) = sum(Y),如果不是,则为此选择X的一个元素。

    【讨论】:

      猜你喜欢
      • 2014-04-18
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 2012-04-06
      • 1970-01-01
      相关资源
      最近更新 更多