2014-01-20 81 views
2

假設我將一個R進程分成10個工作者來運行一些並行模擬。什麼是確保每個工人使用不同隨機數的可靠方法?我一直在使用這個:如何創建隨機種子

myseed <- (unclass(Sys.time())*1e9 * Sys.getpid()) %% 1e9; 
set.seed(myseed); 

但令我驚訝的是,由於工人之間的RNG衝突,我遇到了問題。這裏可能出了什麼問題?是否有更好的隨機性來源可以用來播種RNG?

+2

嘗試'doRNG'軟件包,它是專門爲此目的而構建的。 –

+1

依靠SPRNG庫(也被打包),還有rsprng軟件包中的並行RNG的老祖父(也在Debian/Ubuntu中)。 –

回答

5

參見如何這可以通過使用從該包的功能來完成的細節,這似乎獨立使用平行的功能爲並行運行的vignette("parallel")部6。

給出的例子有:

RNGkind("L'Ecuyer-CMRG") 
set.seed(<something>) 
## start M workers 
s <- .Random.seed 
for (i in 1:M) { 
    s <- nextRNGStream(s) 
    # send s to worker i as .Random.seed 
} 

這小插曲也提到了rstreamrlecuyer包,除了doRNG包,即@Simon漢龍在他的評論中提到,以及由@Dirk提及的rsprng包。

+2

並行程序包也有'clusterSetRNGStream'函數,它可以在1步中完成上述操作。我唯一能看到這個解決方案不夠的是,如果每個進程需要生成2^127個隨機數的倍數,但是這看起來似乎不會經常發生。 –

+0

@GregSnow謝謝,是不是隻適用於SNOW集羣(儘管'mcapply'和'mcparallel'中的行爲相同?在平行**上有點生鏽,因爲沒有使用太多,但... –

+0

看功能的代碼,它基本上是你從上面包括的小插曲(有一些額外的檢查,自動找到M等) ),所以它應該可以在任何'sendCall'工作的羣集上工作。並行軟件包不僅僅適用於雪羣。 –