हर बार एक ही परिणाम क्यों नहीं उत्पन्न होता है?


11

ऐसा क्यों है कि runif()R जैसे यादृच्छिक संख्या जनरेटर हर बार एक ही परिणाम उत्पन्न नहीं करते हैं?

उदाहरण के लिए:

X <- runif(100)
X

हर बार अलग-अलग आउटपुट जेनरेट कर रहा है।

हर बार अलग-अलग आउटपुट उत्पन्न करने का क्या कारण है?

ऐसा करने के लिए पृष्ठभूमि में क्या कार्यशीलता है?


3
इस बारे में सोचने का एक तरीका यह है कि आप खुद से पूछें: "क्या आप चाहते हैं कि आपका रैंडम नंबर जनरेटर हर बार एक ही नंबर जेनरेट करे?"
छायाकार

2
@ssdecontrol: देखें डिल्बर्ट
हेनरी

2

जवाबों:


18

दिल में यह वास्तव में सिर्फ एक आर सवाल नहीं है; यह अधिक सामान्य रूप से यादृच्छिक संख्या पीढ़ी से संबंधित है।

आंकड़ों के कई हिस्सों में "रैंडम" संख्याएं बहुत महत्वपूर्ण हैं। हमें कुछ गुणों के लिए उत्पन्न यादृच्छिक मूल्यों की आवश्यकता है, और (आमतौर पर) बहुत प्रयास यादृच्छिक संख्या जनरेटर के निर्माण और उनके गुणों की जांच करने में जाता है।

विचार यह है कि हम उन मूल्यों का एक क्रम प्राप्त करना चाहते हैं जो वास्तव में यादृच्छिक संख्याओं के लिए एक अच्छा प्रॉक्सी हैं। यादृच्छिक संख्या पीढ़ी का सामान्य वर्कहॉर्स समान वितरण है (इससे हम दूसरों का निर्माण करते हैं, जैसे गॉसियन यादृच्छिक संख्याएं)।

तो (सबसे आम तौर पर) एक संख्यात्मक एल्गोरिदम का उपयोग पूर्णांक के अनुक्रम के निर्माण के लिए किया जाता है, प्रत्येक पिछले फ़ंक्शन के कुछ फ़ंक्शन के संदर्भ में। इन पूर्णांकों को फिर 0 और 1 के बीच लेटाया जाता है (आमतौर पर )।[0,1)

उदाहरण के लिए, कई पिछले एक पर काम करते हैं:

x1=f(x0)z1=x1/mx2=f(x1)z2=x2/mx3=f(x2)z3=x3/m

... जहां के पूर्णांक हैं, तो को इकाई अंतराल में होने के लिए स्केल किया जाता है, और कुछ अक्सर जटिल होता है लेकिन आमतौर पर तेजी से कार्य होता है जो बिट्स के एक नए सेट का उत्पादन करने के लिए इसके तर्क में बिट्स पर काम करता है। यह (उम्मीद है) किसी भी पिछले मूल्यों से संबंधित नहीं लगता है (यदि हम उन्हें हर तरह से देखते हैं, तो भी बहुत सावधानी से - भले ही वे वास्तव में संबंधित हों, क्योंकि वे कैसे बने हैं)। ये सुनिश्चित करने के लिए सावधानीपूर्वक निर्माण किया जाना चाहिए कि अनुक्रम में एक बहुत लंबा चक्र है और यह कि इसके मूल्य वास्तव में एक समान हैं और क्रमिक रूप से किसी भी तरह से निर्भर नहीं हैं, हम वास्तव में परवाह कर सकते हैं (अन्य आवश्यकताओं के एक मेजबान के साथ जो आमतौर पर माना जाता है जरूरी)।xzf

उन्हें एक प्रारंभिक ("बीज") पूर्णांक ( ) की आवश्यकता होती है , जिसे आप आपूर्ति करते हैं (कुछ एल्गोरिदम को एक से अधिक बीज की आवश्यकता हो सकती है)। यदि आप फिर से उसी बीज का उपयोग करते हैं, तो आपको वही क्रम मिलता है (जो परिणामों को पुन: पेश करने में सक्षम होने के लिए आसान है)। लेकिन कुछ समय के लिए, आप बस कुछ यादृच्छिक संख्याएँ चाहते हैं, और आपको परवाह नहीं है कि बीज क्या है जब तक कि प्रारंभ बिंदु आपके द्वारा उपयोग किए गए पिछले लॉट से अलग हो।x0

इसलिए यदि आप एक बीज की आपूर्ति नहीं करते हैं, तो कई पैकेज सिर्फ आपके लिए एक बना सकते हैं। कुछ पैकेज आंतरिक डिजिटल घड़ी पर अंतिम कुछ अंकों को देखते हैं (आमतौर पर किसी तरह से हेरफेर किया जाता है)। कुछ (R शामिल) अंतिम मान संग्रहीत करते हैं ( ऊपर पूर्णांक , अधिक सामान्यतः "राज्य" शब्द का उपयोग उन मामलों को कवर करने के लिए किया जाता है जहां एक से अधिक संख्या शामिल होती है) जो कि अगले बीज के रूप में उपयोग करने के लिए यादृच्छिक संख्या जनरेटर द्वारा उत्पन्न किया गया था। यदि आप एक की आपूर्ति नहीं करते हैं।x3

?runifआर में देखें और आप ध्यान देंगे कि यह यादृच्छिक बीज के अस्तित्व के बारे में बताता है, इस पर मदद के लिए एक लिंक के साथ ?.Random.seedजो आर में उपलब्ध यादृच्छिक संख्या जनरेटर की बड़ी संख्या की व्याख्या करता है (आप यहां तक ​​कि अपने खुद के आपूर्ति कर सकते हैं)। वही हेल्प पेज बताता है कि यदि आपने बीज से पहले रैंडम नंबर जेनरेशन का उपयोग नहीं किया है, तो बीज को शुरू करने के लिए घड़ी से लिया गया है, और उसके बाद पिछले मूल्य को स्टोर किया जाता है (ताकि अगला रैंडम नंबर आपको मिल जाए यदि आपने पिछली बार एक और मान उत्पन्न किया है, तो वही आपको प्राप्त होगा - यह याद रखता है कि "आप कहाँ हैं"।

runifR में फ़ंक्शन (जैसे अन्य पैकेजों में कुछ अन्य यादृच्छिक संख्या पीढ़ी रूटीन जो आमतौर पर कुछ ऐसा ही कर सकते हैं) उस स्थान के बारे में जानता है जहां यादृच्छिक संख्या का बीज रखा गया है। यह उस मूल्य को अपडेट करता रहता है जैसे वह जाता है। तो यह स्पष्ट रूप से एक बीज पारित किए बिना काम कर सकता है, लेकिन यह अभी भी एक का उपयोग करता है; यदि आपने इसे एक नहीं दिया, तो यह केवल उसी का उपयोग करता है जिसे उसने अंतिम बचाया था।

क्योंकि यह हर बार अलग-अलग आउटपुट देता है (यदि आप इसे एक ही अनुक्रम देने के लिए नहीं कहते हैं): यह ऐसा इसलिए करता है क्योंकि हर बार समान मान आमतौर पर बहुत काउंटर उत्पादक होंगे - इसमें बार-बार होने वाले गुण नहीं होंगे। रैंडम सैंपलिंग होगा, जिससे हम उन पुट के लिए बहुत उपयोगी नहीं होंगे जिनके लिए हम रैंडम नंबर जनरेटर का उपयोग करते हैं।


14

हर बार एक ही परिणाम प्राप्त करने के लिए आपको यादृच्छिक बीज सेट करना होगा । ऐसा करने के लिए सेट ?seed का उपयोग करें । विचार करें:

> runif(1)
[1] 0.6467259
> runif(1)
[1] 0.2101857
> set.seed(1)
> runif(1)
[1] 0.2655087
> set.seed(1)
> runif(1)
[1] 0.2655087

आपको इसे पढ़ने में रुचि हो सकती है: सेट.सेड फ़ंक्शन का उपयोग करने के कारण


3
यद्यपि यह परिणामों के एक सेट को पुन: पेश करने के यांत्रिकी के बारे में बताता है, यह प्रश्न को स्वयं संबोधित नहीं करता है, जो आश्चर्यचकित करता है कि इस तरह का व्यवहार स्वचालित क्यों नहीं है।
whuber

@whuber, मुझे लगता है कि सवाल दूर-विषय पर यहाँ नहीं है। मैं तुरन्त बंद करने के लिए मतदान करता था और यदि मेरा विशेषाधिकार होता तो मैं इसे बिल्कुल बंद कर देता। मैंने इसे पोस्ट किया इसलिए ओपी खाली हाथ नहीं जाएगा।
गूँग - मोनिका

रन "set.seed (1)" हर।
निप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.