2015-04-13 3 views
0

Я пытаюсь запустить функцию, в которой есть функция генератора случайных чисел. Результаты при не как то, что я ожидал, так что я сделал следующий тест:Использование parSapply для генерации случайных чисел

# Case 1 
set.seed(100) 
A1 = matrix(NA,20,10) 
for (i in 1:10) { 
    A1[,i] = sample(1:100,20) 
} 

# Case 2 
set.seed(100) 
A2 = sapply(seq_len(10),function(x) sample(1:100,20)) 

# Case 3 
require(parallel) 
set.seed(100) 
cl <- makeCluster(detectCores() - 1) 
A3 = parSapply(cl,seq_len(10), function(x) sample(1:100,20)) 
stopCluster(cl) 

# Check: Case 1 result equals Case 2 result 
identical(A1,A2) 
# [1] TRUE 

# Check: Case 1 result does NOT equal to Case 3 result 
identical(A1,A3) 
# [1] FALSE 

# Check2: Would like to check if it's a matter of ordering 
range(rowSums(A1)) 
# [1] 319 704 

range(rowSums(A3)) 
# [1] 288 612 

В приведенном выше коде, parSapply генерирует другой набор случайных чисел, чем А1 и А2. Моя цель иметь Check2 - это то, что я подозревал, что parSapply может изменить порядок, но, похоже, это не так, поскольку максимальные и минимальные суммы этих случайных чисел различны.

Цените, если кто-то может пролить некоторый цвет на то, почему parSapply дал бы другой результат от sapply. Что мне здесь не хватает?

Заранее благодарен!

ответ

4

Посмотрите на ?vignette(parallel) и, в частности, на «Раздел 6 Генерация случайных чисел». Среди прочего в нем говорится следующее

некоторая осторожность необходима при параллельных вычислениях с использованием (псевдо-) случайные числа: процессы/нить, которые управляют отдельными части вычислений должны работать независимые (и предпочтительно воспроизводимым) случайность число потоков.

Когда процесс R запускается, он берет семя случайного числа из объекта .Random.seed в сохраненной рабочей области или создает один из времени времени и идентификатора процесса, когда сначала используется генерация случайных чисел (см. помощь в RNG). Таким образом, рабочие процессы могут получить одно и то же семя , потому что было восстановлено рабочее пространство, содержащее .Random.seed, или генератор случайных чисел был использован перед разветвлением: в противном случае они получают невоспроизводимое семя (но с очень высокой вероятностью другое семя для каждого рабочего).

Также вы должны взглянуть на ?clusterSetRNGStream.

Смежные вопросы