2015-05-26 3 views
5

के साथ बीजों को नियंत्रित करना कल्पना कीजिए कि हम कई प्रक्रियाएं कर रहे हैं जहां मैं एक कार्यक्रम की शुरुआत में एक समग्र बीज निर्धारित करना चाहता हूं: उदा।mclapply

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 
निश्चित रूप से एक ब्लॉक l1 भीतर

और l2 अलग हैं, लेकिन अगर मैं ऊपर ब्लॉक फिर से चलाने के l1 पहले की तरह ही हो जाएगा और l2 पहले की तरह ही हो जाएगा।

कल्पना कीजिए foo बुरी तरह समय तो लेने वाली है मैं mclapply नहीं lapply उपयोग करना चाहते हैं, तो मैं कार्य करें:

library(parallel) 

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

तो मैं इस ब्लॉक चलाने फिर मैं अलग परिणाम अगली बार मिल जाएगा। मैं एक ही व्यवहार को कैसे बना सकता हूं जैसे lapply के साथ एक समग्र बीज सेट करना, लेकिन mclappy का उपयोग करना। मैं mclapply डॉक के माध्यम से देखा है, लेकिन मुझे यकीन है कि क्योंकि का उपयोग नहीं कर रहा हूँ:

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) 

l1 में परिणाम और l2 ही किया जा रहा है, जो नहीं है जो मैं चाहता ...

+0

आप 'clusterSetupRNG' का उपयोग कर सकते हैं ... http://stackoverflow.com/questions/8358098/how-to-set-seed-for-random-simulations-with-foreach-and-domc-packages – user20650

+0

चीयर्स लेकिन लाइब्रेरी (डीओआरएनजी) उदाहरण दिनांकित प्रतीत होता है और अब कार्यात्मक नहीं है और क्लस्टरसेटअप आरएनजी i मैंने वास्तव में काफी कुछ नहीं किया है, जब तक कि आप मुझे अन्यथा दिखा सकें। – user1320502

+0

थोड़ा बदल गया लगता है ... ['डीआरएनएनजी संदर्भ मैनुअल]] (http://cran.r-project.org/web/packages/doRNG/index.html) के पीजी तीन पर एक नज़र डालें। या 'बर्फ' – user20650

उत्तर

6

parallel पैकेज विशेष समर्थन के साथ आता "एल 'इक्वायर-सीएमआरजी" के लिए यादृच्छिक संख्या जनरेटर जिसे एक ही समय में parallel के रूप में पेश किया गया था। कि करने के बाद कोड जैसे

RNGkind("L'Ecuyer-CMRG") 

,:: आप का उपयोग कर कि समर्थन के लिए दस्तावेज़ पढ़ सकते हैं:

library(parallel) 
?mc.reset.stream 

इसका इस्तेमाल के लिए आपको पहले सक्षम करने के लिए "ल Ecuyer-CMRG" जरूरत

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

पुन: उत्पन्न होगा, लेकिन mclapply पर दो कॉल समान परिणाम लौटाएंगे। ऐसा इसलिए है क्योंकि मास्टर प्रक्रिया में यादृच्छिक संख्या जेनरेटर की स्थिति mclapply पर कॉल करके नहीं बदला जाता है।

मैं निम्नलिखित समारोह का उपयोग किया है यादृच्छिक संख्या से अधिक छोड़ mclapply कार्यकर्ताओं द्वारा इस्तेमाल किया स्ट्रीम:

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

आप व्यवहार मुझे लगता है कि आप चाहते हैं पाने के लिए इस सुविधा का उपयोग कर सकते हैं

संबंधित मुद्दे