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)