R: doParallel (FORK), foreach и генерация случайных чисел

При запуске цикла foreach с использованием пакета doParallel в R и FORK каждый рабочий запускается с одинаковым случайное начальное число, что приводит к дублированию «случайных» чисел.

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

person Scholar    schedule 13.07.2018    source источник
comment
может попробовать foreach(1:4, .combine='c', .options.multicore=list(set.seed=FALSE))   -  person chinsoon12    schedule 13.07.2018
comment
К сожалению, это не работает   -  person Scholar    schedule 13.07.2018
comment
затем удалите .Random.seed (rm(.Random.seed)) перед вашими кодами.   -  person chinsoon12    schedule 13.07.2018


Ответы (1)


Вы можете использовать doRNG, чтобы зарегистрировать дополнительный foreach бэкэнд для независимого < / em> и воспроизводимые случайные числа:

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()

Результат:

[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

Обратите внимание, что здесь важно назвать переменную итератора, даже если она не используется внутри foreach тела.

person Ralf Stubner    schedule 13.07.2018