ruby - रुबी में यादृच्छिक संख्या कैसे प्राप्त करें




random (12)

मैं 0 और n बीच एक यादृच्छिक संख्या कैसे उत्पन्न करूं?


आप rand विधि के साथ एक यादृच्छिक संख्या उत्पन्न कर सकते हैं। rand विधि को पारित तर्क एक integer या range होना चाहिए, और सीमा के भीतर एक संबंधित यादृच्छिक संख्या देता है:

rand(9)       # this generates a number between 0 to 8
rand(0 .. 9)  # this generates a number between 0 to 9
rand(1 .. 50) # this generates a number between 1 to 50
#rand(m .. n) # m is the start of the number range, n is the end of number range

आप बस random_number उपयोग कर सकते हैं।

यदि एक सकारात्मक पूर्णांक n के रूप में दिया जाता है, तो random_number एक पूर्णांक देता है: 0 <= random_number <n।

इसे इस तरह प्रयोग करें:

any_number = SecureRandom.random_number(100) 

आउटपुट 0 और 100 के बीच कोई संख्या होगी।


इस बारे में क्या?

n = 3
(0..n).to_a.sample

इसके बारे में क्या खयाल है?

num = Random.new
num.rand(1..n)

जबकि आप 10 और 42 (जहां 10 समावेशी और 42 अनन्य) के बीच यादृच्छिक संख्या प्राप्त करने के लिए rand(42-10) + 10 उपयोग कर सकते हैं, रूबी 1.9.3 के बाद से एक बेहतर तरीका है, जहां आप कॉल करने में सक्षम हैं:

rand(10...42) # => 13

रूबी के सभी संस्करणों के लिए मेरे backports मणि की आवश्यकता के लिए उपलब्ध है।

रूबी 1.9.2 ने Random क्लास भी पेश किया ताकि आप अपना खुद का यादृच्छिक संख्या जेनरेटर ऑब्जेक्ट बना सकें और एक अच्छा एपीआई हो:

r = Random.new
r.rand(10...42) # => 22
r.bytes(3) # => "rnd"

Random वर्ग स्वयं यादृच्छिक जनरेटर के रूप में कार्य करता है, इसलिए आप सीधे कॉल करते हैं:

Random.rand(10...42) # => same as rand(10...42)

Random.new पर नोट्स

ज्यादातर मामलों में, सबसे आसान rand या Random.rand का उपयोग Random.rand । जब भी आप एक यादृच्छिक संख्या चाहते हैं तो एक नया यादृच्छिक जनरेटर बनाना वास्तव में एक बुरा विचार है । यदि आप ऐसा करते हैं, तो आपको प्रारंभिक बीजिंग एल्गोरिदम के यादृच्छिक गुण मिलेंगे जो यादृच्छिक जनरेटर के गुणों की तुलना में अत्याचारी हैं।

यदि आप Random.new उपयोग Random.new , तो आपको इसे यथासंभव कम से कम कॉल करना चाहिए, उदाहरण के लिए एक बार MyApp::Random = Random.new और इसे हर जगह उपयोग करें।

ऐसे मामले जहां Random.new सहायक है निम्नलिखित हैं:

  • आप एक मणि लिख रहे हैं और rand / Random.rand के अनुक्रम में हस्तक्षेप नहीं करना चाहते हैं कि मुख्य कार्यक्रमों पर भरोसा हो सकता है
  • आप यादृच्छिक संख्याओं के अलग प्रतिलिपिबद्ध अनुक्रम चाहते हैं (प्रति थ्रेड एक कहें)
  • आप यादृच्छिक संख्याओं के पुनरुत्पादित अनुक्रम को सहेजने और फिर से शुरू करने में सक्षम होना चाहते हैं ( Random वस्तुओं को आसान बना सकते हैं)

पहले srand () के साथ आरएनजी बीज मत भूलना।


यदि आप न केवल एक नंबर की तलाश में हैं बल्कि हेक्स या SecureRandom उल्लेख करते हैं कि SecureRandom मॉड्यूल को ActiveSupport से रूबी कोर में 1.9.2+ में अपना रास्ता मिला है। तो एक पूर्ण उड़ा फ्रेमवर्क की आवश्यकता के बिना:

require 'securerandom'

p SecureRandom.random_number(100) #=> 15
p SecureRandom.random_number(100) #=> 88

p SecureRandom.random_number #=> 0.596506046187744
p SecureRandom.random_number #=> 0.350621695741409

p SecureRandom.hex #=> "eb693ec8252cd630102fd0d0fb7c3485"

यह यहां प्रलेखित है: रुबी 1.9.3 - मॉड्यूल: सिक्योररैंडम (lib / securerandom.rb)


यह लिंक इसके बारे में सहायक होगा;

http://ruby-doc.org/core-1.9.3/Random.html

और रूबी में यादृच्छिक संख्याओं के नीचे कुछ और स्पष्टता;

0 से 10 तक एक पूर्णांक उत्पन्न करें

puts (rand() * 10).to_i

एक और पठनीय तरीके से 0 से 10 तक एक संख्या उत्पन्न करें

puts rand(10)

10 से 15 तक एक संख्या उत्पन्न करें 15 सहित

puts rand(10..15)

गैर यादृच्छिक यादृच्छिक संख्या

प्रत्येक बार प्रोग्राम चलाए जाने पर संख्याओं के समान अनुक्रम उत्पन्न करें

srand(5)

10 यादृच्छिक संख्याएं उत्पन्न करें

puts (0..10).map{rand(0..10)}

रूबी में यादृच्छिक संख्या पाने का आसान तरीका है,

def random    
  (1..10).to_a.sample.to_s
end

रेंज = 10..50

रैंड (सीमा)

या

range.to_a.sample

या

range.to_a.shuffle (यह पूरी सरणी को घुमाएगा और यादृच्छिक एक चुनने के लिए आप इस सरणी से पहले या आखिरी या किसी भी यादृच्छिक संख्या को चुन सकते हैं)


rand(range) प्रयोग करें

रूबी यादृच्छिक संख्या से :

यदि आपको छः पक्षीय मरने के रोल को अनुकरण करने के लिए एक यादृच्छिक पूर्णांक की आवश्यकता होती है, तो आप इसका उपयोग करेंगे: 1 + rand(6) । क्रेप्स में एक रोल 2 + rand(6) + rand(6) साथ अनुकरण किया जा सकता है।

अंत में, अगर आपको केवल एक यादृच्छिक फ्लोट की आवश्यकता है, तो rand को बिना किसी तर्क के कॉल करें।

जैसा कि मार्क-आंद्रे लाफोर्ट्यून ने नीचे दिए गए अपने जवाब में उल्लेख किया है (इसे ऊपर उठाएं ) , रुबी 1.9.2 की अपनी Random क्लास है (कि मार्क-आंद्रे ने खुद को डीबग करने में मदद की , इसलिए उस सुविधा के लिए 1.9.2 लक्ष्य )।

उदाहरण के लिए, इस गेम में जहां आपको 10 नंबर अनुमान लगाने की आवश्यकता है , आप उन्हें प्रारंभ कर सकते हैं:

10.times.map{ 20 + Random.rand(11) } 
#=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22]

ध्यान दें:

  • Random.new.rand(20..30) का उपयोग करना Random.new.rand(20..30) का उपयोग Random.new ) आम तौर पर एक अच्छा विचार नहीं होगा, जैसा कि मार्क-एंड्रे लाफोर्ट्यून द्वारा विस्तार से (दोबारा) में बताया गया है, उसके जवाब में (दोबारा)।

  • लेकिन अगर आप Random.new उपयोग नहीं करते हैं, तो क्लास विधि rand केवल एक max मान लेता है, न कि Range , क्योंकि टिप्पणी में banister (ऊर्जावान) इंगित करता है (और Random लिए दस्तावेज़ों में दस्तावेज के रूप में)। केवल उदाहरण विधि एक Range ले सकती है, जैसा कि 7 अंकों के साथ एक यादृच्छिक संख्या उत्पन्न करके सचित्र किया गया है।

यही कारण है कि Random.new.rand(20..30) के बराबर 20 + Random.rand(11) , क्योंकि Random.rand(int) "एक यादृच्छिक पूर्णांक शून्य से अधिक या बराबर है और उससे कम तर्क । " 20..30 में 30 शामिल हैं, मुझे 11 को छोड़कर, 0 और 11 के बीच यादृच्छिक संख्या के साथ आने की आवश्यकता है।


rand(6)    #=> gives a random number between 0 and 6 inclusively 
rand(1..6) #=> gives a random number between 1 and 6 inclusively

ध्यान दें कि रेंज विकल्प केवल रूबी के नए (1.9+ मेरा मानना ​​है) संस्करणों में उपलब्ध है।







random