2015-05-26 29 views
5

Bir programın başlangıcında bir genel tohum ayarlamak istediğim birkaç işlem gerçekleştirdiğimizi düşünün: ör.Tohumların Mclapply ile kontrol edilmesi

mylist <- list(as.list(rep(NA,3)), as.list(rep(NA,3))) 
foo <- function(x){ for(i in 1:length(x)){ 
         x[[i]] <- sample(100,1) 
         } 
         return(x) 
        } 

# start block 
set.seed(1) 
l1 <- lapply(mylist, foo) 
l2 <- lapply(mylist, foo) 
# end 
bir blok l1 içinde tabii

ve l2 farklıdır, ama yine yukarıda blok çalıştırın l1 daha önce olduğu gibi aynı olacak ve l2 daha önce olduğu gibi aynı olacaktır.

library(parallel) 

# start block 
set.seed(1) 
mclapply(mylist , foo, mc.cores = 3) 
mclapply(mylist , foo, mc.cores = 3) 
# end 

ben bu bloğu çalıştırırsanız

yine farklı sonuçlar yakın zaman alacak:

i mclapply değil lapply kullanmak istiyorum, bu yüzden yapmak foo korkunç zaman çok tüketen düşünün. Bir genel tohumun lapply ile ayarlanmasını ancak mclappy'u kullanarak aynı davranışı nasıl üretebilirim. Ben mclapply doküman içinde baktım ama kullanan çünkü emin değilim:

set.seed(1) 
l1 <- mclapply(mylist , foo, mc.cores = 3, mc.set.seed=FALSE) 
l2 <- mclapply(mylist , foo, mc.cores = 3, mc.set.seed=FALSE) 

sonuç l1 ve l2 aynı kalmak suretiyle ne istiyorum olmadığı

+0

"clusterSetupRNG" ... http://stackoverflow.com/questions/8358098/how-to-set-seed-for-random-simulations-with-foreach-and-domc-packages – user20650

+0

neşelerini kullanabilirsiniz. kitaplık (doRNG) örneği tarihli ve artık işlevsel görünmüyor ve clusterSetupRNG i Aksini bana göstermediğin sürece gerçekten istediğim şey değil. – user1320502

+0

Bir miktar değişmiş gibi görünüyor ... ['doRNG referans kılavuzu'] 'ndan üçüne bakın (http://cran.r-project.org/web/packages/doRNG/index.html). Ya da 'kar'ı kullanın – user20650

cevap

6

parallel paket özel desteği ile geliyor ... parallel ile aynı zamanda tanıtılan "L'Ecuyer-CMRG" rasgele sayı üreteci için. Sen kullanarak o destek için belgeleri okuyabilir:

library(parallel) 
?mc.reset.stream 

Kullanmak için, "L'Ecuyer-CMRG" etkinleştirmek için öncelikle ihtiyacı:

RNGkind("L'Ecuyer-CMRG") 

o yaptıktan sonra kodu gibi:

yeniden üretilecek, ancak iki çağrı mclapply aynı sonuçları döndürecektir. Bunun nedeni, ana işlemde rastgele sayı üretecinin durumunun mclapply numaralı telefonu arayarak değişmemesidir.

Ben mclapply işçiler tarafından kullanılan akışlarını rasgele sayı üzerinde atlamak için aşağıdaki fonksiyonu kullandım:

set.seed(1) 
mclapply(mylist, foo, mc.cores=3) 
skip.streams(3) 
mclapply(mylist, foo, mc.cores=3) 
skip.streams(3) 
:

skip.streams <- function(n) { 
    x <- .Random.seed 
    for (i in seq_len(n)) 
    x <- nextRNGStream(x) 
    assign('.Random.seed', x, pos=.GlobalEnv) 
} 

Ne istediğiniz düşünüyorum davranışı almak için bu işlevi kullanabilirsiniz