2012-12-29 13 views
5

के भीतर बीज बी/सेटिंग बीज/सी पास करना मैं आर कोड के भीतर सी बना रहा हूं।आर कोड

मेरे सी कोड में मैं यादृच्छिक संख्या उत्पन्न करने के लिए रैंड() फ़ंक्शन का उपयोग कर रहा हूं। आर-ext.pdf का कहना है कि मुझे आदेशों का उपयोग करके बीज सेट करना होगा;

GetRNGstate(); 
    PutRNGstate(); 

हालांकि मैं उपरोक्त इन आदेशों का उपयोग कर रहा हूं, फिर भी मुझे एक ही बीज के लिए अलग-अलग मूल्य मिल रहे हैं। क्या आप मुझे कोई मदद दे सकते हैं?

न्यूनतम उदाहरण है:

सी में:

# include <R.h> 
# include <Rinternals.h> 
# include <Rmath.h> 
# include <R_ext/Linpack.h> 

SEXP example(){ 

    SEXP output; 
    GetRNGstate(); 
    PROTECT(output = allocVector(INTSXP, 1)); 
    INTEGER(output)[0] = rand() % 50; 
    PutRNGstate(); 
    UNPROTECT(1); 
    return(output); 
} 

आर में:

dyn.load("example.so") 
## The following codes return different values at ever run 
set.seed(1) 
.Call("example") 

अग्रिम धन्यवाद।

उत्तर

7

अपनी सोच में एक तर्क त्रुटि है कि - आप सही तरीके से बीज सेट , कोड से आर RNG प्रारंभ ... लेकिन फिर आर RNG की प्रणाली RNG फोन के बजाय।

rand()unif_rand() (या norm_rand()) के साथ बदलें और आपको सेट किया जाना चाहिए।

Rcpp यह सब आसान बनाता है और आपको विभिन्न वितरण फ़ंक्शन से आकर्षित करने के लिए वेक्टरिज्ड पहुंच प्रदान करता है (लेकिन यदि आप चाहें तो आप इसे सी में भी कर सकते हैं)।

Rcpp से cppFunction() उपयोग करके, हम अब भी देखभाल RNGScope जो बदले में प्रदान करता है GetRNGstate()/PutRNGstate() के ले (जबकि पुराने उदाहरण अभी भी RNGScope की इन्स्टेन्शियशन दिखाने; के रूप में यह संदर्भ गिनती के एक बराबर करता है यह कोई नुकसान करता है जोड़ने)।

तो यह वास्तव में एक एक लाइनर परिभाषित करने के लिए, ऑटो का विस्तार, संकलन, और लोड है यह:

R> cppFunction("double myrand() { return norm_rand(); }") 
R> for (i in 1:5) { set.seed(42); cat(i, " -- ", myrand(), "\n") } 
1 -- 1.37096 
2 -- 1.37096 
3 -- 1.37096 
4 -- 1.37096 
5 -- 1.37096 
R> 

जबकि फिर से बोने के बिना हम

R> for (i in 1:5) { cat(i, " -- ", myrand(), "\n") } 
1 -- -0.564698 
2 -- 0.363128 
3 -- 0.632863 
4 -- 0.404268 
5 -- -0.106125 
R> 

अंत में, यदि मिल आप वास्तव में चाहते हैं कि आप निश्चित रूप से rand() का उपयोग करना जारी रखें (लेकिन अपने चूसने वाले प्रदर्शन पर साहित्य देखें) लेकिन फिर का उपयोग इसके बीजिंग फ़ंक्शन के बजाय आर के बजाय करें।

+0

एक लाइनर! वास्तव में शक्तिशाली! – agstudy

+0

हां, यद्यपि 'cppFunction() 'उस रेखा के काम को बनाने के लिए दृश्यों के पीछे कुछ जादू करता है - यह विस्तारित हो जाता है। लेकिन हमारे लिए उपयोग करने के लिए, यह जादू के बहुत करीब है ;-) –

+0

लेकिन क्या मैं SourceCpp का उपयोग करना बेहतर है (कम से कम डीबग उद्देश्य के लिए)? – agstudy