2017-03-21 67 views
0

以下两段代码做相同的工作,但给出不同的结果。它需要一个/两分钟来运行代码:两个编码用于相同的目的,但给出不同的结果

# 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 

这2块相同,因为,a等于一,部分(1-a)*b1g将消失,不要紧b1是否等于零或任何其他值。

同样,如果没有a为1,g中的部分a*(b2+b3)将会消失。因此,b2的元素是零还是另一个值(如果a的对应元素是零)并不重要。

但是为什么2块的结果不同?

+0

set.seed()怎么样?如果生成随机分布,除非定义种子,否则它应该是不同的。 –

+0

@AleksandrVoitov由于'n'足够大,它会给出2位小数位的相似结果(总是我找到了)。我仍然编辑过。谢谢。 –

+0

@Leaf恕我直言1块比块2计算另一个'b1'。取决于'a'的元素的值。对于'a [i]'== 0,计算相同的'b1 [i]',但对于'a [i]'== 1,第一个块计算'b1 [i]'== 0。 – jogo

回答

2

的问题是,在块1 (a==0)(a==1)语法看起来像它会导致相同的数值结果为块2,但是它们会导致命令g[g>150]切片g不同的组块1比在块被切2.

在块1中,(a==0) * rexp(n, 1/182.5)确保将所有不需要的索引设置为零。在数据块2中,这些索引处仍有值,其中一些值可能导致g大于150.因此,对于数据块2,length(g[g>150])是更大的数字,因此您会得到不同的答案。

相关问题