当使用 "L' Ecuyer-CMRG"RNG 时,R 不会重置种子?

标签 r parallel-processing prng

我在 R 中做了一些并行模拟,我注意到种子 使用“L'Ecuyer-CMRG”rng 时不会更改。我正在读书 “Parallel R”一书,选项 mc.set.seed = TRUE 应该给出 每次调用 mclapply() 时,每个工作人员都会获得一个新种子。

这是我的代码:

library(parallel)
RNGkind("L'Ecuyer-CMRG")

mclapply(1:2, function(n) rnorm(n), mc.set.seed = TRUE)
[[1]]
[1] -0.7125037

[[2]]
[1] -0.9013552  0.3445190

mclapply(1:2, function(n) rnorm(n), mc.set.seed = TRUE)
[[1]]
[1] -0.7125037

[[2]]
[1] -0.9013552  0.3445190

编辑:同样的事情发生在我的台式机和笔记本电脑上(均为 Ubuntu 12.04 LTS)。

最佳答案

在我看来,如果您想保证 R session 中对 mclapply 的后续调用获得不同的随机数,您需要使用不同的值调用 set.seed,删除全局变量“.Random.seed” ,或者在再次调用 mclapply 之前在该 R session 中生成至少一个随机数。

出现此行为的原因是 mclapply(与 mcparallel 不同)在内部调用 mc.reset.stream。这会将“parallel”包中隐藏的种子重置为“.Random.seed”的值,因此,如果再次调用 mclapply 时“.Random.seed”没有更改,则由 mclapply 启动的工作程序将获得与之前相同的随机数。

请注意,clusterApply 和 parLapply 等函数的情况并非如此,因为它们使用持久工作线程,因此会继续从 RNG 流中抽取随机数。但是每次调用 mclapply 时都会 fork 出新的工作线程,这可能会让这种行为变得更加困难。

以下是使用 mclapply 将种子设置为不同值以获取不同随机数的示例:

RNGkind("L'Ecuyer-CMRG")
set.seed(100)
mclapply(1:2, function(i) rnorm(2))
set.seed(101)
mclapply(1:2, function(i) rnorm(2))

以下是删除“.Random.seed”的示例:

RNGkind("L'Ecuyer-CMRG")
mclapply(1:2, function(i) rnorm(2))
rm(.Random.seed)
mclapply(1:2, function(i) rnorm(2))

这是在主机上生成随机数的示例:

RNGkind("L'Ecuyer-CMRG")
mclapply(1:2, function(i) rnorm(2))
rnorm(1)
mclapply(1:2, function(i) rnorm(2))

我不确定哪种方法是最好的方法,但这可能取决于您想要做什么。

虽然看起来简单地多次调用 mclapply 而不更改“.Random.seed”会产生可重现的结果,但我不知道这是否得到保证。为了保证可重现的结果,我认为你需要调用 set.seed:

RNGkind("L'Ecuyer-CMRG")
set.seed(1234)
mclapply(1:2, function(i) rnorm(2))
set.seed(1234)
mclapply(1:2, function(i) rnorm(2))

关于当使用 "L' Ecuyer-CMRG"RNG 时,R 不会重置种子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15070377/

相关文章:

glmnet : NA/NaN/Inf in foreign function call 中的 R 错误

r - 在 R 中使用 jsonlite 时,如何指定仅将某些条目视为数组?

c++ - 如何有条件地终止 OpenMP 中的并行区域?

matlab - 如何在 MATLAB 中并行化输入和显示?

bash - 生成一个大于特定数字的随机数

objective-c - Objective C 中的多个随机数生成器

thread-safety - 使用非线程安全随机数生成器更正 C 中 pi monte carlo 的 OpenMP pragma

r - 按日期和 ID 过滤重复项

r - 如何有效地使用 which() 来比较 r 中的一列和一行?

Python 哈希值在线程之间有所不同