如何创建随机种子

3
假设我将一个R进程分叉成10个工作程序来运行某些并行模拟。有什么可靠的方法确保每个工作程序使用不同的随机数?我一直在使用以下方法:
myseed <- (unclass(Sys.time())*1e9 * Sys.getpid()) %% 1e9;
set.seed(myseed);

然而令我惊讶的是,由于工人之间的随机数生成器 (RNG) 冲突,我遇到了问题。这里可能出了什么问题?有没有更好的随机源可以用来生成 RNG 的种子?


2
尝试使用专门为此目的构建的“doRNG”软件包。 - Simon O'Hanlon
1
还有一个老牌的并行RNGs,它在rsprng包中(也在Debian / Ubuntu中),依赖于SPRNG库(该库也已打包)。 - Dirk Eddelbuettel
1个回答

5

请参考“parallel”包中的vignette("parallel")第6节,了解如何使用该包中的函数来完成此操作,这些函数似乎与使用parallel的函数进行并行运行无关。

那里给出的示例是:

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 O'Hanlon在他的评论中提到的包,以及@Dirk提到的rsprng包。


2
并行包还有clusterSetRNGStream函数,可以在一步中完成上述操作。我唯一能想到这种解决方案不足的情况是,如果每个进程需要生成2^127的随机数倍数,但这似乎不会经常发生。 - Greg Snow
@GregSnow 谢谢,这只是针对 SNOW 集群的吗(虽然 mcapplymcparallel 中也有相同的行为)?我对 parallel 有点生疏,因为还没有多少使用经验... - Gavin Simpson
查看函数代码,基本上与您在小品文中提供的代码相同(加入了一些额外的检测、自动发现 M 等),因此它应该可以在任何 sendCall 能够使用的集群上运行。并行包不仅适用于 snow 集群。 - Greg Snow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接