2017-03-21 66 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])是更大的數字,因此您會得到不同的答案。

相關問題