0

每次我运行以下代码时,向量中的数字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)))

为什么会这样?我可以做些什么来确保在降雪并行化过程中生成的随机数是可重现的?

4

1 回答 1

1

由于 R 是单线程的,任何并行化的代码实际上都是在启动多个会话。因此,在这里您实际上正在旋转 4 个单独的“子”会话,sfLapply()并且种子设置仅在您的“父”会话中发生一次。“子”会话不知道其他会话,因此不知道您要在每个会话中重新设置种子。

您可以set.seed()进入testFun()以解决此问题:

testFun = function(i) {
  set.seed(11)
  result <- rnorm(1,10,3)
}

sfExport 可能值得探索,因为它旨在将参数分配给此类上下文的“子”会话。

于 2021-03-01T17:29:35.793 回答