रैंडम नंबर गेमिंग, एन्क्रिप्शन और बिल्डिंग सिमुलेशन जैसे विभिन्न उद्देश्यों के लिए उपयोगी होते हैं। तकनीकी रूप से, कंप्यूटर विशुद्ध रूप से गणना द्वारा यादृच्छिक संख्याएँ उत्पन्न नहीं कर सकते हैं। किसी भी नियतात्मक उपकरण पर वास्तव में यादृच्छिक संख्याएँ उत्पन्न करना मौलिक रूप से असंभव है। आप जिस सर्वश्रेष्ठ की उम्मीद कर सकते हैं वह है छद्म यादृच्छिक संख्याएं, संख्याओं की एक धारा जो ऐसा प्रतीत होती है मानो वे बेतरतीब ढंग से उत्पन्न हुई हों।
इस लेख में, हम रूबी में रैंडम नंबर जेनरेट करने के विभिन्न तरीकों को देखेंगे।
कर्नेल#रैंड के साथ रैंडम नंबर जेनरेट करना
आरंभ करने के लिए, आइए rand
. के साथ यादृच्छिक संख्याएं उत्पन्न करें तरीका। जब विधि को बिना किसी तर्क के कहा जाता है, तो यह एक फ्लोट देता है जो 0.0 से अधिक या बराबर और 1.0 से कम होता है।
rand()
> 0.7308136972953823
एक पूर्णांक प्राप्त करने के लिए, आप फ़ंक्शन के लिए एक पूर्णांक पास करते हैं। फ़ंक्शन एक यादृच्छिक पूर्णांक मान लौटाएगा जो 0 से अधिक या उसके बराबर है और फ़ंक्शन को दिए गए पूर्णांक से कम है। हर बार निम्नलिखित को चलाने पर, आपको एक संख्या मिलेगी जो 0 और 7 के बीच होगी।
rand(8)
> 5
किसी विशेष श्रेणी के भीतर यादृच्छिक संख्या के लिए, श्रेणी को rand
. पर पास करें ।
निम्नलिखित एक समावेशी का उपयोग करता है निचली सीमा से यादृच्छिक संख्या उत्पन्न करने के लिए श्रेणी (1
), ऊपरी सीमा तक (और शामिल) (10
.) )।
rand(1..10)
> 6
अगला उदाहरण गैर-समावेशी . का उपयोग करता है निचली सीमा से यादृच्छिक संख्या उत्पन्न करने के लिए श्रेणी, ऊपरी सीमा तक (लेकिन शामिल नहीं)।
rand(1...10)
> 9
सीमा फ़्लोटिंग पॉइंट मानों के बीच भी हो सकती है।
rand(1.5..3.0)
> 1.7494305393711571
आप rand
. के साथ नकारात्मक सीमा सीमाओं का भी उपयोग कर सकते हैं ।
rand(-5..-1)
> -5
जैसा कि नीचे दिखाया गया है, एकल ऋणात्मक संख्याओं में उत्तीर्ण होना आश्चर्यजनक परिणाम दे सकता है।
rand(-100)
> 94
rand(-0.5)
> 0.7692627344737486
ऐसा इसलिए है क्योंकि तर्क के लिए n
rand
. में पास किया गया , rand
यादृच्छिक संख्या 0 से (लेकिन शामिल नहीं) तक देता है n.to_i.abs
. उपरोक्त उदाहरण के लिए (-100).to_i.abs
100
है और (-0.5).to_i.abs
है 0
, इस प्रकार परिणामी यादृच्छिक संख्याएँ।
कॉलिंग rand(0)
rand()
को कॉल करने के समान है . आपको 0.0 और 1.0 के बीच यादृच्छिक संख्याएँ मिलेंगी (समावेशी नहीं)।
कर्नेल#srand के साथ प्रतिलिपि प्रस्तुत करने योग्य अनुक्रम उत्पन्न करना
यादृच्छिक संख्याएँ उत्पन्न करने की अगली विधि पर जाने से पहले, आइए पहले srand
को देखें। समारोह।
Kernel#srand
Kernel#rand
. के लिए बीज सेट करता है . हम प्रोग्राम के विभिन्न रनों के बीच यादृच्छिक संख्याओं के दोहराने योग्य अनुक्रम उत्पन्न करने के लिए इसका उपयोग कर सकते हैं।
इसका अर्थ समझने के लिए, हमें पहले यह समझना होगा कि यादृच्छिक संख्याएँ कैसे उत्पन्न होती हैं।
बीज से "रैंडम" नंबर जेनरेट करना
जैसा कि पहले कहा गया है, कंप्यूटर पूरी तरह से गणना से वास्तव में यादृच्छिक संख्या उत्पन्न नहीं करते हैं। वे जो करते हैं वह संख्याओं का एक क्रम उत्पन्न करता है जो यादृच्छिक लगता है। ऐसा करने के लिए, कंप्यूटर एक बीज संख्या से शुरू होता है, जिसे वह कुछ एल्गोरिथम के माध्यम से चलाता है और फिर एक प्रतीत होता है यादृच्छिक आउटपुट को बाहर निकालता है।
बीज संख्या कंप्यूटर द्वारा विभिन्न तत्वों के संयोजन का उपयोग करके उत्पन्न की जाती है, उदा। टाइमस्टैम्प, कार्यक्रम की प्रक्रिया आईडी, आदि। चूंकि ये तत्व प्रत्येक अनुरोध के लिए एक यादृच्छिक संख्या उत्पन्न करने के लिए भिन्न होते हैं, बीज संख्या हमेशा भिन्न होगी, जो संख्याओं के एक अलग अनुक्रम का उत्पादन करेगी, इस प्रकार परिणामी यादृच्छिक संख्या आउटपुट। यदि आप एक ही बीज के साथ एल्गोरिदम चलाते हैं, तो आपको हर बार संख्याओं का एक ही क्रम मिलेगा। यह है Kernel#srand
हमें करने की अनुमति देता है।
srand
आमतौर पर परीक्षण में प्रयोग किया जाता है। यह आपके ऐप में परीक्षण कोड के लिए आसान हो सकता है जो यादृच्छिकता से संबंधित है, ऐसे मूल्यों के साथ जो यादृच्छिक हैं लेकिन अभी भी परीक्षण के लिए पर्याप्त अनुमानित हैं। यह बग को अलग करने या पुन:उत्पन्न करने में भी मदद कर सकता है।
नीचे हम srand
. का उपयोग करते हैं बीज सेट करने के लिए और फिर rand
. पर कॉल करें पहले कुछ अलग-अलग यादृच्छिक संख्याओं का उत्पादन करने के लिए और फिर यादृच्छिक संख्याओं के कुछ अनुक्रमों को उत्पन्न करने के लिए।
srand(777)
rand()
> 0.152663734901322
rand()
> 0.3023566097075212
10.times.map { rand(10) }
> [7, 1, 7, 4, 7, 9, 8, 7, 2, 0]
10.times.map { rand(10) }
> [1, 2, 4, 5, 7, 1, 7, 2, 2, 7]
अगर आप srand
run चलाते हैं फिर से उसी बीज के साथ और वही कॉल करें जो हमने पहले की थीं, आप देखेंगे कि हमें वही रैंडम नंबर मिलते हैं।
srand(777)
rand()
> 0.152663734901322
rand()
> 0.3023566097075212
10.times.map { rand(10) }
> [7, 1, 7, 4, 7, 9, 8, 7, 2, 0]
10.times.map { rand(10) }
> [1, 2, 4, 5, 7, 1, 7, 2, 2, 7]
रैंडम के साथ रैंडम नंबर जेनरेट करना
आप रैंडम क्लास के साथ रैंडम नंबर भी जेनरेट कर सकते हैं।
वर्ग विधि rand
Kernel#rand
. की आधार कार्यक्षमता प्रदान करता है फ़्लोटिंग पॉइंट मानों के बेहतर संचालन के साथ।
Random.rand(1...10)
> 5
Kernel#rand
के विपरीत , अगर Random.rand
ऋणात्मक दिया गया है या 0
तर्क, यह एक ArgumentError उठाता है।
सामान्य वितरण के आधार पर यादृच्छिक संख्या उत्पन्न करना
वास्तविक दुनिया में, कई चीजें सामान्य वितरण का पालन करती हैं। यदि आपके पास मूल्यों की एक श्रृंखला है जिसके अंतर्गत कुछ आता है, तो शायद ही आपको सभी मूल्यों का समान वितरण मिलता है। अधिकतर, अधिकांश डेटा एक छोटी सीमा के भीतर गिरते हैं, जबकि एक छोटा प्रतिशत बड़ी सीमा के भीतर आता है। आइए एक उदाहरण के रूप में एक वयस्क व्यक्ति की ऊंचाई को लें। सबसे छोटी ऊंचाई 54.6 सेमी (21.5 इंच) दर्ज की गई है जबकि सबसे ऊंची 267 सेमी (8'9 ") है। यदि आप आबादी में पुरुषों की ऊंचाई का अनुकरण करने के लिए डेटा उत्पन्न करना चाहते हैं, तो हो सकता है कि आप rand
इन सीमाओं के साथ। आप नहीं चाहते कि 8'9'' वाले आदमी के मिलने की प्रायिकता 6' वाले आदमी के समान हो, क्योंकि बाद वाला अधिक सामान्य है।
सामान्य वितरण का पालन करने वाली चीजों के अन्य उदाहरण हैं:
- माप में त्रुटियां
- रक्तचाप
- टेस्ट स्कोर
- वयस्क पुरुष/महिला का वजन
इस तरह के उपयोग के मामलों के लिए बेहतर यादृच्छिक संख्या उत्पन्न करने के लिए, आप rubystats
. का उपयोग कर सकते हैं रत्न।
$ gem install rubystats
require 'rubystats'
adult_male_height = Rubystats::NormalDistribution.new(178, 10)
sample = 50.times.map { adult_male_height.rng.round(1) }
> [183.2, 169.5, 189.7, 171.9, 176.0, 179.3, 189.3, 175.3, 188.3, 190.0, 185.5, 182.8, 187.2, 191.6, 185.4, 178.4, 187.1, 183.3, 189.6, 179.7, 172.7, 174.4, 153.8, 197.4, 176.0, 174.6, 181.1, 182.0, 204.7, 185.2, 175.9, 167.7, 160.6, 170.5, 169.3, 160.6, 165.6, 166.4, 182.6, 179.7, 183.1, 171.9, 185.4, 175.4, 179.7, 176.9, 160.6, 173.8, 181.9, 190.2]
उपरोक्त में, हम पुरुषों के लिए औसत ऊंचाई (178cm) और 10cm के मानक विचलन को NormalDistribution.new
पास करते हैं , इस सामान्य वितरण में आने वाले 50 मान उत्पन्न करने से पहले। यदि आप गणित के बारे में उत्सुक हैं, तो यह लेख आपको रूचि दे सकता है।
रैंडम राउंडअप
यह हमें इस चर्चा के अंत में लाता है। हमने रूबी में 'रैंडम' नंबर बनाने के कुछ अलग तरीकों को कवर किया, जिसमें rand
, srand
, Random
और Rubystats
. हमने संक्षेप में यह भी बताया कि 'यादृच्छिक' संख्याएँ कैसे बनाई जाती हैं और इस कारण पर ध्यान दिया कि नियतात्मक उपकरण वास्तविक यादृच्छिक संख्याएँ क्यों नहीं बना सकते हैं।
आपको ध्यान देना चाहिए कि कवर की गई विधियां उन सभी उपयोग मामलों के लिए आदर्श नहीं हैं जो यादृच्छिकता की मांग करते हैं। विधियों द्वारा उत्पन्न पूर्णांक या फ़्लोटिंग पॉइंट नंबर गेमिंग में मौका देने या सिमुलेशन बनाने के लिए आदर्श हो सकते हैं, लेकिन ऐसी परिस्थितियों में जो कुछ सुरक्षा के लिए कॉल करते हैं, उदाहरण के लिए पासवर्ड रीसेट टोकन उत्पन्न करते समय, आपको सिक्योररैंडम का उपयोग करने पर विचार करना चाहिए। SecureRandom
. के साथ , आप हेक्साडेसिमल, बेस 64, बाइनरी और यूयूआईडी स्ट्रिंग्स जेनरेट कर सकते हैं जिन्हें प्लेन नंबरों की तुलना में क्रैक करना बहुत कठिन होता है।
हमें उम्मीद है कि आपको इनमें से कुछ दिलचस्प लगा होगा। यदि आपके पास हमारे द्वारा कवर की गई कोई टिप्पणी या प्रश्न हैं, तो कृपया हमसे @AppSignal पर संपर्क करें। आप हमें उन विषयों के लिए अपने अनुरोध भी भेज सकते हैं जिन्हें आप कवर करना चाहते हैं।
हमने SecureRandom
पर एक नोट शामिल करने के लिए 1 अगस्त, 2018 को इस लेख को अपडेट किया है