假设我将一个R进程分成10个工作者来运行一些并行模拟。什么是确保每个工人使用不同随机数的可靠方法?我一直在使用这个:如何创建随机种子
myseed <- (unclass(Sys.time())*1e9 * Sys.getpid()) %% 1e9;
set.seed(myseed);
但令我惊讶的是,由于工人之间的RNG冲突,我遇到了问题。这里可能出了什么问题?是否有更好的随机性来源可以用来播种RNG?
假设我将一个R进程分成10个工作者来运行一些并行模拟。什么是确保每个工人使用不同随机数的可靠方法?我一直在使用这个:如何创建随机种子
myseed <- (unclass(Sys.time())*1e9 * Sys.getpid()) %% 1e9;
set.seed(myseed);
但令我惊讶的是,由于工人之间的RNG冲突,我遇到了问题。这里可能出了什么问题?是否有更好的随机性来源可以用来播种RNG?
参见如何这可以通过使用从该包的功能来完成的细节,这似乎独立使用平行的功能为并行运行的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
}
这小插曲也提到了rstream和rlecuyer包,除了doRNG包,即@Simon汉龙在他的评论中提到,以及由@Dirk提及的rsprng包。
并行程序包也有'clusterSetRNGStream'函数,它可以在1步中完成上述操作。我唯一能看到这个解决方案不够的是,如果每个进程需要生成2^127个随机数的倍数,但是这看起来似乎不会经常发生。 –
@GregSnow谢谢,是不是只适用于SNOW集群(尽管'mcapply'和'mcparallel'中的行为相同?在平行**上有点生锈,因为没有使用太多,但... –
看功能的代码,它基本上是你从上面包括的小插曲(有一些额外的检查,自动找到M等) ),所以它应该可以在任何'sendCall'工作的群集上工作。并行软件包不仅仅适用于雪群。 –
尝试'doRNG'软件包,它是专门为此目的而构建的。 –
依靠SPRNG库(也被打包),还有rsprng软件包中的并行RNG的老祖父(也在Debian/Ubuntu中)。 –