2014-01-20 46 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'工作的群集上工作。并行软件包不仅仅适用于雪群。 –