R 用mclappy控制种子

R 用mclappy控制种子,r,parallel-processing,apply,seeding,random-seed,R,Parallel Processing,Apply,Seeding,Random Seed,想象一下,我们正在进行一系列的过程,我想在一个项目的开始设置一个整体种子:例如 mylist <- list( as.list(rep(NA,3)), as.list(rep(NA,3)) ) foo <- function(x){ for(i in 1:length(x)){ x[[i]] <- sample(100,1) } ret

想象一下,我们正在进行一系列的过程,我想在一个项目的开始设置一个整体种子:例如

mylist <- list( as.list(rep(NA,3)), as.list(rep(NA,3)) )
foo <- function(x){  for(i in 1:length(x)){ 
                       x[[i]] <- sample(100,1)
                         }
                      return(x) 
                     } 

# start block
set.seed(1)
l1 <- lapply(mylist, foo)
l2 <- lapply(mylist, foo)
# end
如果我再次运行此块,下次将得到不同的结果。如何产生与使用
lappy
但使用
mclappy
设置一个整体种子相同的行为。我已经查看了
mclappy
doc,但我不确定,因为使用:

set.seed(1)
l1 <-  mclapply(mylist , foo,  mc.cores = 3, mc.set.seed=FALSE)
l2 <-  mclapply(mylist , foo,  mc.cores = 3, mc.set.seed=FALSE)
set.seed(1)

l1并行
软件包附带了对“L'Ecuyer-CMRG”随机数生成器的特殊支持,该生成器与并行同时推出。您可以通过以下方式阅读该支持的文档:

library(parallel)
?mc.reset.stream
要使用它,首先需要启用“L'Ecuyer-CMRG”:

执行此操作后,请输入以下代码:

set.seed(1)
mclapply(mylist, foo, mc.cores=3)
mclapply(mylist, foo, mc.cores=3)
将是可复制的,但对
mclappy
的两个调用将返回相同的结果。这是因为调用
mclappy
不会更改主进程中随机数生成器的状态

我使用以下函数跳过了
mclappy
工作者使用的随机数流:

skip.streams <- function(n) {
  x <- .Random.seed
  for (i in seq_len(n))
    x <- nextRNGStream(x)
  assign('.Random.seed', x, pos=.GlobalEnv)
}

您可以使用
clusterSetupRNG
。。。干杯,但图书馆(doRNG)的例子似乎已经过时,不再起作用,clusterSetupRNG并不是我真正要求的,除非你能给我看其他的。似乎有点变化。。。看一看第三页。或者使用
snow
实际上
?“%dorng%”的帮助页面给出了一个示例
set.seed(1)
mclapply(mylist, foo, mc.cores=3)
mclapply(mylist, foo, mc.cores=3)
skip.streams <- function(n) {
  x <- .Random.seed
  for (i in seq_len(n))
    x <- nextRNGStream(x)
  assign('.Random.seed', x, pos=.GlobalEnv)
}
set.seed(1)
mclapply(mylist, foo, mc.cores=3)
skip.streams(3)
mclapply(mylist, foo, mc.cores=3)
skip.streams(3)