रैंडम नंबर्स गेमिंग, एन्क्रिप्शन और सिमुलेशन बनाने जैसे विभिन्न उद्देश्यों के लिए उपयोगी हैं। तकनीकी रूप से, कंप्यूटर शुद्ध गणना द्वारा रैंडम नंबर्स उत्पन्न नहीं कर सकते। किसी भी डिटरमिनिस्टिक डिवाइस पर वास्तव में रैंडम नंबर्स उत्पन्न करना मौलिक रूप से असंभव है। सबसे अच्छा जो आप आशा कर सकते हैं वह है सूडोरैंडम नंबर्स, नंबर्स की एक स्ट्रीम जो ऐसा प्रतीत होती है जैसे वे रैंडमली उत्पन्न हुए हों।
इस लेख में, हम रूबी में रैंडम नंबर्स उत्पन्न करने के विभिन्न तरीकों को देखेंगे।
Kernel#rand के साथ रैंडम नंबर्स उत्पन्न करना
शुरू करने के लिए, आइए rand मेथड के साथ रैंडम नंबर्स उत्पन्न करें। जब मेथड को बिना आर्ग्युमेंट्स के कहा जाता है, तो यह एक फ्लोट लौटाता है जो 0.0 से बड़ा या बराबर और 1.0 से कम होता है।
rand() > 0.7308136972953823
एक पूर्णांक प्राप्त करने के लिए, आप फंक्शन को एक पूर्णांक पास करते हैं। फंक्शन एक रैंडम पूर्णांक मान लौटाएगा जो 0 से बड़ा या बराबर और फंक्शन को पास किए गए पूर्णांक से कम होगा। हर बार निम्नलिखित चलाने पर, आपको 0 और 7 के बीच एक नंबर मिलेगा।
rand(8) > 5
एक विशेष रेंज के भीतर रैंडम नंबर के लिए, rand को Range पास करें।
निम्नलिखित एक इन्क्लूसिव रेंज का उपयोग करता है जो निचली सीमा (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 के बीच रैंडम नंबर्स मिलेंगे (इन्क्लूसिव नहीं)।
Kernel#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 चलाते हैं और वही कॉल करते हैं जो हमने पहले किए थे, तो आप देखेंगे कि हमें वही रैंडम नंबर्स मिलते हैं।
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]
Random के साथ रैंडम नंबर्स उत्पन्न करना
आप Random क्लास के साथ भी रैंडम नंबर्स उत्पन्न कर सकते हैं।
क्लास मेथड 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]
उपरोक्त में, हम NormalDistribution.new को पुरुषों के लिए औसत ऊंचाई (178सेमी) और 10सेमी के मानक विचलन को पास करते हैं, इससे पहले कि इस सामान्य वितरण में आने वाले 50 मान उत्पन्न हों। यदि आप गणित के बारे में उत्सुक हैं, तो यह लेख आपको रुचिकर लग सकता है।
रैंडम राउंडअप
यह हमें इस चर्चा के अंत में लाता है। हमने rand, srand, Random और Rubystats के साथ रूबी में 'रैंडम' नंबर्स बनाने के कुछ अलग तरीकों को कवर किया। हमने यह भी संक्षेप में छुआ कि 'रैंडम' नंबर्स कैसे बनाए जाते हैं और देखा कि डिटरमिनिस्टिक डिवाइस वास्तविक रैंडम नंबर्स क्यों नहीं बना सकते।
आपको ध्यान देना चाहिए कि कवर किए गए मेथड्स उन सभी उपयोग के मामलों के लिए आदर्श नहीं हैं जो रैंडमनेस की मांग करते हैं। मेथड्स द्वारा उत्पन्न पूर्णांक या फ्लोटिंग पॉइंट नंबर्स गेमिंग में मौका पैदा करने या सिमुलेशन बनाने के लिए आदर्श हो सकते हैं, लेकिन उन स्थितियों में जो कुछ सुरक्षा की मांग करती हैं, उदाहरण के लिए पासवर्ड रीसेट टोकन उत्पन्न करते समय, आपको SecureRandom का उपयोग करने पर विचार करना चाहिए। SecureRandom के साथ, आप हेक्साडेसिमल, बेस64, बाइनरी और UUID स्ट्रिंग्स उत्पन्न कर सकते हैं जो सादे नंबर्स की तुलना में क्रैक करना बहुत कठिन हैं।
हमें उम्मीद है कि आपको इसमें से कुछ दिलचस्प लगा। यदि आपके पास हमारे द्वारा कवर किए गए विषय पर कोई टिप्पणी या प्रश्न हैं, तो कृपया @AppSignal पर हमसे संपर्क करें। आप हमें उन विषयों के लिए अपने अनुरोध भी भेज सकते हैं जिन्हें आप कवर करना चाहते हैं।
हमने इस लेख को 1 अगस्त, 2018 को SecureRandom पर एक नोट शामिल करने के लिए अपडेट किया है