【问题标题】:How to create random seed如何创建随机种子
【发布时间】:2014-02-10 05:55:40
【问题描述】:

假设我将一个 R 进程分叉成 10 个工作人员来运行一些并行模拟。确保每个工人使用不同的随机数的可靠方法是什么?我一直在用这个:

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

但令我惊讶的是,由于工人之间的 RNG 冲突,我遇到了问题。这里可能出了什么问题?是否有更好的随机性来源可以用来播种 RNG?

【问题讨论】:

  • 试试专门为此目的构建的doRNG 包。
  • rsprng 包(也在 Debian / Ubuntu 中)中还有并行 RNG 的老祖宗,依赖于 SPRNG 库(也已打包)。

标签: r random parallel-processing


【解决方案1】:

请参阅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 包。

【讨论】:

  • 并且并行包还具有clusterSetRNGStream 功能,可在 1 步中完成上述操作。我唯一能看到这个解决方案不够的情况是,如果每个进程都需要生成 2^127 个随机数的倍数,但这似乎不会经常发生。
  • @GregSnow 谢谢,这不仅适用于 SNOW 集群(尽管 mcapplymcparallel 中的行为相同)? parallel 有点生疏,因为没怎么用过,但是...
  • 查看函数的代码,它基本上就是您在上面的小插图中包含的内容(进行了一些额外的检查,自动查找 M 等),因此它应该适用于 @ 987654330@ 将继续工作。并行包不仅仅适用于雪团。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 2015-12-24
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 2016-08-12
相关资源
最近更新 更多