无法理解为什么随机数算法会给出不同的结果

Cannot understand why random number algorithms give different results

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

    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

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

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

要获得与第二种方法完全相同的矩阵,即计算 length(probs)*things 长向量,您需要 "organize" 它在 length(probs) 个向量中长度 things.

(无论哪种方式,种子都是 "treated" 完全相同 "in between" 计算所以得到的数字是相同的)

编辑

如果您想对向量 probs 使用不同的值,您需要计算 events2 的方式与 [=] 在相同的 "order" 中使用概率22=] 所以首先向量 probs 的第一个值,直到达到所需的长度,然后是第二个值,等等,然后像以前一样组织矩阵的列,所以使用 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