R snow rlecuyer:使用临时种子应用函数



我想使用snow::clusterApply并行应用一个函数。我的函数在函数的一个部分中使用了一个临时(预定义)种子,但通常应该保持独立的随机数。每个"作业"的临时种子不同。

我可以做以下事情:

# setting up cluster of type="SOCK"
library(snow)
cl <- makeSOCKcluster(2)
# this is my function
myfu <- function(seed){
    # temporary seed:
    x <- R.utils::withSeed(rnorm(10),seed)
    # more calculation with independent RNG:
    y <- x*rnorm(10)
    return(list(stays=x,changes=y))
}
# run example:
seed <- 1:4
data.frame(clusterApply(cl,seed,myfu))
# reproduce
data.frame(clusterApply(cl,seed,myfu))
stopCluster(cl)

但是,按照雪包文件中"雪簇中的统一随机数生成"部分中给出的链接(http://homepage.stat.uiowa.edu/~luke/R/cluster/cluster.html),我读到"默认的随机数生成器可能非常相关",应该使用额外的包,例如包rlecuyer

现在,如果我试图将其包含在代码中,那么set.seedwithSeed就不再有用了:

# setting up cluster of type="SOCK"
library(snow)
library(rlecuyer)
cl <- makeSOCKcluster(2)
# setup RNG Stream
clusterSetupRNGstream(cl,seed=1:6)
# run example:
seed <- 1:4
data.frame(clusterApply(cl,seed,myfu))
# can't reproduce
data.frame(clusterApply(cl,seed,myfu))
stopCluster(cl)

当我需要在作业基础上而不是在clusterApply调用之前调用set.seedwithSeed时,我如何并行处理它们?

愚蠢的我。在调用set.seed/withSeed时使用kind="L'Ecuyer-CMRG"(当然)解决了我的问题。

相关内容

  • 没有找到相关文章

最新更新