无法理解为什么随机数算法会给出不同的结果
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
我试图理解为什么以下 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