2013-04-30 71 views
0

是否有可能在本地環境中使用set.seed()而不影響隨後的隨機數生成?在一些函數中設置種子以獲得可重複的結果是很常見的,但我認爲這是不幸的,因爲它會影響下一代隨機數,即使在環境之外。本地環境中的set.seed()

有沒有可能避免這種行爲?

set.seed(123) 
runif(1) #[1] 0.2875775 
runif(1) #[1] 0.7883051 
local({ 
    set.seed(123) 
    print(runif(1)) 
}) 
#[1] 0.2875775 
runif(1) #[1] 0.7883051 (This should not be the second number again) 
+2

我覺得你的示例代碼中缺少'local'一個'set.seed'。 – Roland 2013-04-30 15:30:36

+0

@羅蘭:是的。謝謝。 – 2013-04-30 21:45:13

+2

重複的問題? [在本地設置種子不是全局在R](http://stackoverflow.com/questions/14324096/setting-seed-locally-not-globally-in-r) – 2013-04-30 21:56:14

回答

3

?set.seed

[如果]沒有種子;當需要時創建一個新的(從R 2.14.0開始,即進程ID)。

set.seed(42) 
rnorm(1) 
#[1] 1.370958 
rm(.Random.seed) 
rnorm(1) 
#[1] -0.4352643 
set.seed(42) 
rnorm(1) 
#[1] 1.370958 
rm(.Random.seed) 
rnorm(1) 
#[1] -2.338973 
+0

這並沒有太大的幫助,因爲通常的做法是設置一個種子在你的模擬開始(或任何)獲得可重複的結果。但是可能你有多個應該是隨機的方法。現在這個方法調用一個函數,它調用'set.seed()'。現在下面的隨機數字在每次運行中都是相同的,這不是我想要的。另外'rm(.Random.seed)'會導致不可重現的結果。 – 2013-04-30 16:13:22

+0

我不明白。要麼你想重現,那麼你需要使用'set.seed',或者你想完全隨機,那麼你需要一個隨機種子。也許你想要像'for(我在1:10){set.seed(i); RNORM(1)}'? – Roland 2013-04-30 16:21:50

+0

@jakobr如果你正在做多次運行,你要麼在一個進程中對它們進行序列化,這樣你就可以像Roland建議的那樣做,並且一個接一個地設置新的種子,否則你將使用並行計算,在這種情況下,你可以查看' doRNG'包和'%dorng%'循環。 – 2013-04-30 17:15:36