R:doParallel(FORK)、foreach和随机数生成
在R和FORK中使用doParallel包运行foreach循环时,每个worker将从相同的随机种子开始,从而导致重复的“随机”数R:doParallel(FORK)、foreach和随机数生成,r,random,foreach,doparallel,R,Random,Foreach,Doparallel,在R和FORK中使用doParallel包运行foreach循环时,每个worker将从相同的随机种子开始,从而导致重复的“随机”数 set.seed(1) cl <- makeCluster(2, type = "FORK") registerDoParallel(cl) foreach(1:4, .combine = 'c') %dopar% {rnorm(1, mean = 0, sd = 1)} stopImplicitCluster() [1] -0.6264538 -0.62
set.seed(1)
cl <- makeCluster(2, type = "FORK")
registerDoParallel(cl)
foreach(1:4, .combine = 'c') %dopar% {rnorm(1, mean = 0, sd = 1)}
stopImplicitCluster()
[1] -0.6264538 -0.6264538 0.1836433 0.1836433
解决这个问题的最好办法是什么
现在,我通过在每次循环迭代中设置一个新种子来解决这个问题,即
cl <- makeCluster(2, type = "FORK")
registerDoParallel(cl)
foreach(i = 1:4, .combine = 'c') %dopar% {
set.seed(i)
rnorm(1, mean = 0, sd = 1)}
stopImplicitCluster()
[1] -0.8969145 -0.9619334 0.2167549 -0.8408555
您可以使用注册一个额外的foreach后端,以获得独立且可复制的随机数:
library(doParallel)
library(doRNG)
cl <- makeCluster(2, type = "FORK")
registerDoParallel(cl)
registerDoRNG(seed = 123)
foreach(i=1:4, .combine = 'c') %dopar% {rnorm(1, mean = 0, sd = 1)}
stopImplicitCluster()
请注意,即使在foreach正文中没有使用它,在这里也很重要。可能尝试foreach1:4、.combine='c',.options.multicore=listset.seed=false这不起作用。请在代码之前删除.Random.seed rm.Random.seed。
[1] 0.4254817 -0.8817684 -0.4448349 -1.7773268
attr(,"rng")
attr(,"rng")[[1]]
[1] 407 642048078 81368183 -2093158836 506506973 1421492218 -1906381517
attr(,"rng")[[2]]
[1] 407 1340772676 -1389246211 -999053355 -953732024 1888105061 2010658538
attr(,"rng")[[3]]
[1] 407 -1318496690 -948316584 683309249 -990823268 -1895972179 1275914972
attr(,"rng")[[4]]
[1] 407 524763474 1715794407 1887051490 -1833874283 494155061 -1221391662