问题描述
每次运行以下代码时,向量 result_seq
中的数字保持不变,因为我在生成向量之前使用了 set.seed(11)
。
然而,似乎即使我在生成 set.seed(11)
中的数字之前再次使用了 result_par
,但每次运行代码时数字都会改变。
library(sNowfall)
sNowfall::sfInit(parallel = TRUE,cpus = 4)
testFun = function(i) {
result <- rnorm(1,10,3)
}
nsim <- 10
set.seed(11)
result_seq <- sapply(1:nsim,testFun)
print(mean(result_seq))
set.seed(11)
result_par <- sfLapply(1:nsim,testFun)
print(mean(as.numeric(result_par)))
为什么会这样?如何确保在降雪并行化过程中生成的随机数具有可重现性?
解决方法
由于 R 是单线程的,任何代码的并行化实际上都会启动多个会话。因此,您实际上在 sfLapply()
中分出 4 个单独的“子”会话,并且种子设置仅在您的“父”会话中发生一次。 “子”会话不知道其他会话,因此不知道您想在每个会话中重新设置种子。
您可以将 set.seed()
移动到 testFun()
来解决此问题:
testFun = function(i) {
set.seed(11)
result <- rnorm(1,10,3)
}
sfExport
可能值得探索,因为它旨在将参数分发到“子”会话以用于此类上下文。