【问题标题】:Correct way to generate parallel random booleans生成并行随机布尔值的正确方法
【发布时间】:2015-08-28 19:31:02
【问题描述】:

从这个 q (Cannot understand why random number algorithms give different results) 开始,我有一些代码模拟随机布尔值。因为我希望做这个 ALOT 并且快速,我希望将它包装在一个这样的函数中:

# setup external to function
number <- 5
probs <- rep(0.1, 5)

# core function
event.sim <- function(var, things){
    mod.probs <- probs * var
    events <- matrix(rbinom(things*number, 1, probs), ncol=number, byrow=FALSE)
    av.events <- max(rowSums(events))
    return(av.events)
}

library("parallel")
cl <- makeCluster(4)
clusterExport(cl, c("event.sim", "probs", "number"))
test <- clusterMap(cl, event.sim, var=df1$var1, things=df1$things, SIMPLIFY=TRUE)
stopCluster(cl)

并使用来自parallel 的clusterMap() 将其并行化。现在这没问题,我有这个工作,但是我担心通过并行执行,我的布尔值不再足够“随机”。我可以在网上找到很多关于并行生成随机数的信息,但它们似乎都描述了一次生成大量随机数,而且我无法将其与每次运行时绘制相对较少的随机布尔值的函数联系起来。我在这里有问题吗?我需要做些不同的事情吗?

【问题讨论】:

  • 你有什么证据表明这不再是“足够随机的”了?如果同一台机器上的并行线程可以产生相同的随机数(我怀疑这不太可能),那么您可以随机创建一组种子并为每个工作线程提供不同的种子。
  • @ForrestR.Stevens - 我没有确凿的证据,但我读到的所有内容都说要非常小心并行 RNG - 因此我很小心:)。 @Roland - 谢谢,这很有帮助,虽然我不完全理解在我的示例代码中应该在哪里使用 nextRNGStream(s) 命令

标签: r random parallel-processing


【解决方案1】:

您只需要在创建集群之后和运行函数之前使用clusterSetRNGStream(cl)。

【讨论】:

  • 感谢@Nick K - 是的,在我无法弄清楚 Roland 指导我的小插图示例后,我偶然发现了这一点。
猜你喜欢
  • 2013-10-12
  • 2017-09-05
  • 2016-08-13
  • 2023-03-28
  • 1970-01-01
  • 2015-12-29
  • 2014-10-06
  • 1970-01-01
相关资源
最近更新 更多