2012-12-21 17 views
17

में दर्ज कर सकूं, मैं यहां एक आर न्यूबी हूं।वर्तमान यादृच्छिक बीज मुद्रित करें ताकि मैं इसे set.seed() के बाद

देना कहते हैं कि मैं कोड की पंक्ति

set.seed(123456) 

तो मैं मूल्य 123456 पाने के लिए तो मैं यह प्रलेखन प्रयोजनों के लिए प्रिंट कर सकते हैं चाहते हैं, और अगर हो भविष्य में कुछ समय मूल्य फिर से दर्ज आवश्यकता नहीं है। तो मैं उस बीज को कैसे प्राप्त करूं?

ध्यान दें कि मैं कोड की उपरोक्त पंक्ति पर टिप्पणी कर सकता हूं, इसलिए मुझे वास्तव में यह नहीं पता होगा कि बीज 123456 पर क्या है। इसलिए मुझे वर्तमान बीज के स्थान को एक पूर्णांक के रूप में प्रिंट करने की आवश्यकता है, न कि 626 पूर्णांक की एक सूची के रूप में।

+2

'बीज <- 123456 करने के लिए यह आसान नहीं होगा; set.seed (बीज) 'और फिर प्रिंट करें और' बीज' के मूल्य को स्टोर करें? – joran

+0

हां, लेकिन मैं कोड की रेखा पर टिप्पणी करूंगा जब मेरे पास कोई विशिष्ट बीज नहीं है जिसे मैं शुरू करना चाहता हूं। निष्पक्षता में –

+0

, उस पृष्ठ में बहुत सारी जानकारी है ... –

उत्तर

25

वहाँ बीज set.seed() में इस्तेमाल किया और .Random.seed में जानकारी के बीच प्रभावी रूप से एक एक-तरफा संबंध है, ?Random.seed कहता है और @ मैटटेनबेम का उत्तर दिखाता है, .Random.seed में जानकारी को सहेजा और बहाल किया जा सकता है। मैं एक समारोह है कि .Random.seed की वर्तमान स्थिति से एक सरल पूर्णांक बीज निकाले जाते हैं के लिए इच्छा की सराहना करते हैं, लेकिन इसके अभाव में, आप को बचाने और पूर्ण जानकारी को बहाल ... उदाहरण

set.seed(1001) 
save(".Random.seed",file="random_state_seed1001.RData") ## save current state 
runif(1) 
## [1] 0.9856888 
runif(1) 
## [1] 0.4126285 
runif(1) 
## [1] 0.4295392 
load("random_state_seed1001.RData") ## restore state just after set.seed() 
runif(1) 
## [1] 0.9856888 

के लिए @JoshuaUlrich के रूप में करने के लिए है बताते हैं, यह केवल काम करता है/केवल सुरक्षित है आप बचत और बहाल करने के बीच RNG के प्रकार (और सामान्य विचलित जनरेटर के प्रकार) को संशोधित नहीं करता है, तो ...

एक और पूरा समाधान:

save_rng <- function(savefile=tempfile()) { 
    if (exists(".Random.seed")) { 
     oldseed <- get(".Random.seed", .GlobalEnv) 
    } else stop("don't know how to save before set.seed() or r*** call") 
    oldRNGkind <- RNGkind() 
    save("oldseed","oldRNGkind",file=savefile) 
    invisible(savefile) 
} 

restore_rng <- function(savefile) { 
    load(savefile) 
    do.call("RNGkind",as.list(oldRNGkind)) ## must be first! 
    assign(".Random.seed", oldseed, .GlobalEnv) 
} 

इसे आज़माएं:

set.seed(101) 
RNGstore <- save_rng() ## save file name 
runif(1) 
## [1] 0.3721984 
runif(10) 
## [1] 0.04382482 0.70968402 0.65769040 0.24985572 0.30005483 0.58486663 
## [7] 0.33346714 0.62201196 0.54582855 0.87979573 
restore_rng(RNGstore) 
runif(1) 
## [1] 0.3721984 

यह भी देखें: http://www.cookbook-r.com/Numbers/Saving_the_state_of_the_random_number_generator/

+1

यह वास्तव में एक सुरक्षित समाधान नहीं है, यह सुनिश्चित किए बिना कि आरएनजी प्रकार और सामान्य प्रकार को वर्तमान में '.Random.seed' द्वारा उल्लिखित मानों पर सेट किया गया है। –

+0

@ जोशुआउलिच, क्या आप जानते हैं कि पूर्ण आरएनजी राज्य को सहेजने और बहाल करने के लिए वहां कहीं भी एक काम किया गया उदाहरण है (यह 'उदाहरण में नहीं है ("। Random.seed")' जहां तक ​​मैं कह सकता हूं)?यदि नहीं, तो मैं अपने प्रश्न को संपादित करने की परेशानी पर जा सकता हूं, अन्यथा मैं इसे लिंक कर दूंगा ... –

+0

मुझे इस तरह के किसी भी उदाहरण के बारे में पता नहीं है; मुझे संदेह है कि एक ऐसा है क्योंकि यही 'set.seed' है। –

3

एक बार जब आप set.seed कहलाते हैं, तो आपको .Random.seed संदर्भित करने में सक्षम होना चाहिए (http://stat.ethz.ch/R-manual/R-patched/library/base/html/Random.html को और जानकारी के लिए देखें)।

एक साधारण उदाहरण:

set.seed(123) 
tmp <- .Random.seed 
> runif(10) 
[1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673 0.0455565 0.5281055 0.8924190 0.5514350 0.4566147 
.Random.seed <- tmp 
> runif(10) 
[1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673 0.0455565 0.5281055 0.8924190 0.5514350 0.4566147 
+2

लेकिन .Random.seed मुझे 626 पूर्णांक की एक सूची देता है। –

3

यहाँ कुछ है कि व्यवहार में ठीक काम करना चाहिए (लेकिन जैसे के लिए नहीं किया जाना चाहिए है क्रिप्टोग्राफी):

new.seed <- as.integer(runif(1)*2e9) 
cat("Random seed: ", new.seed, "\n") 
set.seed(new.seed) 

आप की क्या ज़रूरत है वास्तव में इस के लिए बीज काम करने के लिए सेट करने के लिए, तो यह के रूप में यह आप आसानी से एक है की सुविधा देता है, मूल प्रश्न के लिए काफी एक जवाब नहीं है, लेकिन हो सकता है आप के लिए क्या देख रहे थे एक निश्चित निर्दिष्ट पूर्णांक के साथ मैन्युअल रूप से सेट किए बिना यादृच्छिक बीज निर्दिष्ट करें।