以下两大块代码执行相同的工作,但会给出不同的结果。运行代码需要一到两分钟:
# chunk 1:
n <- 10000000
set.seed(1)
a <- rbinom(n, 1, .5)
b1 <- (a==0) * rexp(n, 1/182.5)
b2 <- (a==1) * rexp(n, 1/365)
e <- (a==1) * rbinom(n, 1, .5)
b3 <- (e==1) * rexp(n, 1/365)
g <- (1-a)*b1 + a*(b2+b3)
p <- length(g[g>150])/length(g)
p
# chunk 2:
n <- 10000000
set.seed(1)
a <- rbinom(n, 1, .5)
b1 <- rexp(n, 1/182.5)
b2 <- rexp(n, 1/365)
e <- rbinom(n, 1, .5)
b3 <- rexp(n, 1/365)
g <- (1-a)*b1 + a*(b2+b3)
p <- length(g[g>150])/length(g)
p
这两个块是相同的,因为a
等于一,(1-a)*b1
中的g
部分将消失,b1
是否等于无关紧要零或任何其他值。
同样,如果a
为1,a*(b2+b3)
中的g
部分将会消失。因此,如果b2
的对应元素为零,则a
的元素是零还是其他值无关紧要。
但为什么2块的结果不同?
答案 0 :(得分:2)
问题是,块1中的(a==0)
和(a==1)
语法看起来像是导致与块2中相同的数值结果,但它们会导致命令g[g>150]
切片{ {1}}在块1中不同于在块2中切片。
在块1中,g
确保将所有不需要的索引设置为零。在块2中,这些索引处仍然存在值,其中一些值可能导致(a==0) * rexp(n, 1/182.5)
大于150.因此,g
对于块2来说是一个更大的数字,因此您得到一个不同的答案。