【问题标题】:Cannot understand why random number algorithms give different results无法理解为什么随机数算法会给出不同的结果
【发布时间】:2015-06-12 14:03:34
【问题描述】:

我试图理解为什么以下 2 个代码 sn-ps 会导致不同的输出,我希望有人能启发我。第二个版本稍微快一点 - 这是我的动机,因为这一切都在一个循环中,但我需要知道它是否等效,如果不是那么为什么?

    things <- 100000
    n.events <- 3
    probs <- rep(0.05, n.events)

    # Method 1
    set.seed(1)
    events1 <- matrix(n.events, nrow=things)
    events1 <- sapply(probs, function(probs) rbinom(things,1,probs))

    # Method 2
    set.seed(1)
    events2 <- matrix( rbinom(things*n.events, 1, probs), ncol=n.events,    byrow=TRUE)

    > identical(events1, events2)
    [1] FALSE

【问题讨论】:

  • set.seed(1); events2 &lt;- matrix( rbinom(things*n.events, 1, probs), ncol=n.events, byrow=FALSE); identical(events1, events2) # TRUE........
  • @CathG,作为答案发布(有更多解释)?
  • 哦,我太笨了。太棒了,谢谢。
  • np。遵循@BenBolker 的建议,如果您认为值得,我将其发布为答案?
  • 请去吧

标签: r random


【解决方案1】:

要获得相同的结果,您需要将byrow=FALSE 而不是byrow=TRUE 作为第二个选项。

第一种计算随机矩阵的方法是计算rbinom(things,1,probs)length(probs) 次,每次获得一个things 长向量。

要使用第二种方法获得完全相同的矩阵,即计算 length(probs)*things 长向量,您需要将其“组织”在长度为 thingslength(probs) 向量中。

(无论哪种方式,种子在计算之间“处理”完全相同,因此获得的数字相同)

编辑

如果你想为向量probs 使用不同的值,你需要以与events1 相同的“顺序”使用概率的方式计算events2,所以首先向量的第一个值问题,直到达到所需的长度,然后是第二个值等,然后以与以前相同的方式组织矩阵的列,因此使用byrow=FALSE

示例

# define the parameters:
things <- 100000
n.events <- 3
probs <- c(0.05, 0.01, 0.20)

# compute the random vectors with sapply
set.seed(1)
events1 <- sapply(probs, function(probs) rbinom(things,1,probs))

# compute the random vectors "directly", using the "right" probs
set.seed(1)
events2 <- matrix(rbinom(things*n.events, 1, rep(probs, e=things)), ncol=n.events,    byrow=FALSE)

# check the results
identical(events1, events2)
[1] TRUE

【讨论】:

  • 其实——我发现了一个问题。这在所有概率都相同时有效 - 但如果它们不同则无效。例如,如果您设置 probs &lt;- c(0.05, 0.01, 0.20),然后使用方法 2 和 byrows=FALSE 运行代码 - 您不会以这些比例在列中获得事件,而是几率相等。如果你设置byrows=TRUE 相同的测试仍然是错误的,但至少你在每一列中得到了正确的比例。似乎有些东西正在某个地方用byrows=FALSE 洗牌。有什么想法吗?
  • @user2498193,如rbinom的帮助中所述:“n以外的数字参数被回收到结果的长度”所以prob参数被回收,直到它达到所需长度,但它被回收为c(probs, probs, probs, ...) 所以,假设probs=c(p1, p2, p3),首先使用p1,然后使用p2,然后使用p3,然后再次使用p1,而对于events1,它是p1、p1、p1等,然后p2、p2 等。每次计算后,种子都会改变,因此,为了使 events2events1 相同,您必须使用 p1、p1、p1、... 然后 p2、p2 等计算随机向量。我会编辑。
猜你喜欢
  • 2012-09-27
  • 1970-01-01
  • 2015-09-05
  • 2012-06-09
  • 1970-01-01
  • 2015-07-20
  • 2011-01-21
  • 1970-01-01
  • 2014-02-01
相关资源
最近更新 更多