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


786

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


कोड srand <some_number>लिखने से पहले उपयोग करने से randआपको एक नियतात्मक (यानी दोहराने योग्य) छद्म यादृच्छिक अनुक्रम मिलेगा, अगर आपको इसकी आवश्यकता है। रूबी-doc.org/core-2.5.6/Random.html#method-c-srand
पर्पलजेट

जवाबों:


952

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


2
क्या यह बहुत गैर-रूबी जैसा नहीं है? मैंने सोचा था कि सब कुछ एक वस्तु है, कम से कम-आश्चर्य और वह ...
दान रोसेनस्टार्क

1
@ इयर: यह थोड़ा "पेरिशल" है। अब रूबी के पास रैंडम क्लास है (मेरा उत्तर देखें)
मार्क-एंड्रे लैफ्यून

3
@VonC: नई Randomकक्षा का उल्लेख करने के लिए आपने अपने उत्तर को संपादित किया, यह बहुत अच्छा है , लेकिन Random.newअपने उदाहरण में कई बार कॉल करना एक भयानक विचार है । मैंने अपना उत्तर उस स्थिति के लिए संपादित किया है।
मार्क-एंड्रे लाफ्यून

2
@VonC आह :) अगर मैं थोड़ा कठोर था तो क्षमा करें, इसने मुझे आश्चर्यचकित कर दिया
घुड़सवारी

1
Random.rand वास्तव में एक सीमा को स्वीकार करता है । (
१.९ .३ के

591

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

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.new, तो आपको इस तरह से शायद ही कभी कॉल करना चाहिए , उदाहरण के लिए एक बार के रूप में MyApp::Random = Random.newऔर हर जगह इसका उपयोग करें।

जिन मामलों Random.newमें मददगार हैं वे निम्नलिखित हैं:

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

1
अति उत्कृष्ट! +1। मैंने उस नई सुविधा (और बग # 3104;) के साथ आपके योगदान का उल्लेख करने के लिए अपना जवाब पूरा कर लिया है।
VonC

1
@ अय्यर: मेरा backportsरत्न केवल उन तरीकों का एक संग्रह है जो RUby 1.8.7, 1.9.1, 1.9.2 के लिए नए हैं, लेकिन रूबी में लागू किए गए हैं। मैं रूबीस्पेक का उपयोग यह सुनिश्चित करने के लिए करता हूं कि परिणाम रूबी के साथ संगत हैं।
मार्क-एंड्रे लाफ्यून

@ मार्क-एंड्रे लाफ्यून, इसके लिए धन्यवाद। यह हमेशा मेरे लिए अजीब रहा है कि गति आवश्यकताओं के कारण रूबी को गैर-रूबी (सी या जो भी) में कितना लागू किया गया है। लेकिन उनका ब्रेक है
डेन रोसेनस्टार्क

5
Random.rand(10..42)काम नहीं करता। Random.randवर्ग विधि एक सीमा को स्वीकार नहीं करता। (रूबी १.९ .२ पीपी १y०)
y:46 पर घोड़ा जुग २p

1
@banister: वाह, मुझे विश्वास था कि नई एपीआई (रेंज, बाइट्स आदि के साथ रैंड) ... रैंडम ऑब्जेक्ट के माध्यम से सीधे उपलब्ध थी। रेंज के साथ रैंड 1.9.3 में होगा, और मैं बाइट्स के लिए एक फीचर अनुरोध करूंगा। मैंने अपना उत्तर संपादित किया है
मार्क-आंद्रे लाफोर्ट

46

यदि आप न केवल एक नंबर बल्कि हेक्स या यूआईडी के लिए भी मांग कर रहे हैं, तो यह ध्यान देने योग्य है कि SecureRandomमॉड्यूल ने ActiveSupport1.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)


अगर आपको 4 अंक रैंडम संख्या की आवश्यकता है तो क्या होगा?
onurozgurozkan

1
onurozgurozkan मैं मानती हूंSecureRandom.random_number(1000..9999)
JayTarka

1
SecureRandom.random_number()कोई सीमा नहीं है, इसलिए नहीं। आप शायद SecureRandom.random_number(10_000)(0-9999 के लिए) या SecureRandom.random_number(9_000)+1_000(1000-9999 के लिए ) कुछ चाहते हैं ।
mwp

1
रैंडम.रांड (1000..9999)
जेसी किसान

37

आप 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

मुझे लगता rand(1..6)है कि शीर्ष उत्तर की तुलना में आपके रीड्स क्लियर का उपयोग करना rand(6)+1
आइसोमॉर्फिज्म

21

खैर, मुझे लगा। जाहिरा तौर पर एक रैंडिन (?) फ़ंक्शन है जिसे रैंड कहा जाता है:

rand(n + 1)

यदि कोई अधिक विस्तृत उत्तर के साथ उत्तर देता है, तो मैं उसे सही उत्तर के रूप में चिह्नित करूंगा।


2
हाँ, यह कर्नेल मॉड्यूल में बनाया गया है।
क्रिस्टोफ शियासेल

17

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

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

3
यह ध्यान दिया जाना चाहिए कि इस समाधान की तरह संख्याओं की एक सरणी उत्पन्न करना बड़ी सीमाओं पर भयानक प्रदर्शन है क्योंकि यह O (n) है जबकि randO (1) है।
ट्रेविस


9

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

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

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

any_number = SecureRandom.random_number(100) 

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


6
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+ मेरा मानना ​​है) संस्करणों में उपलब्ध है।


मेरा मानना ​​है कि रेंज विकल्प केवल में उपलब्ध है ruby 1.9.3+1.9.2जब मैंने कम से कम कोशिश की तो यह काम नहीं किया ।
बटकिंस

6

रेंज = 10..50

रैंड (सीमा)

या

range.to_a.sample

या

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


range.to_a.sampleएक बड़ा विचार है जब नमूना बड़ा है।
ग्रेजेगोरज़


4

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

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)}

इसके अलावा आप रूबी में यादृच्छिक नग पर बहुत स्पष्ट तस्वीर कदम से कदम के लिए इस ब्लॉग का अनुसरण कर सकते हैं; sitepoint.com/tour-random-ruby
सैम

4

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

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

2

शायद यह आपकी मदद करे। मैं अपने ऐप में इसका इस्तेमाल करता हूं

https://github.com/rubyworks/facets
class String

  # Create a random String of given length, using given character set
  #
  # Character set is an Array which can contain Ranges, Arrays, Characters
  #
  # Examples
  #
  #     String.random
  #     => "D9DxFIaqR3dr8Ct1AfmFxHxqGsmA4Oz3"
  #
  #     String.random(10)
  #     => "t8BIna341S"
  #
  #     String.random(10, ['a'..'z'])
  #     => "nstpvixfri"
  #
  #     String.random(10, ['0'..'9'] )
  #     => "0982541042"
  #
  #     String.random(10, ['0'..'9','A'..'F'] )
  #     => "3EBF48AD3D"
  #
  #     BASE64_CHAR_SET =  ["A".."Z", "a".."z", "0".."9", '_', '-']
  #     String.random(10, BASE64_CHAR_SET)
  #     => "xM_1t3qcNn"
  #
  #     SPECIAL_CHARS = ["!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "=", "+", "|", "/", "?", ".", ",", ";", ":", "~", "`", "[", "]", "{", "}", "<", ">"]
  #     BASE91_CHAR_SET =  ["A".."Z", "a".."z", "0".."9", SPECIAL_CHARS]
  #     String.random(10, BASE91_CHAR_SET)
  #      => "S(Z]z,J{v;"
  #
  # CREDIT: Tilo Sloboda
  #
  # SEE: https://gist.github.com/tilo/3ee8d94871d30416feba
  #
  # TODO: Move to random.rb in standard library?

  def self.random(len=32, character_set = ["A".."Z", "a".."z", "0".."9"])
    chars = character_set.map{|x| x.is_a?(Range) ? x.to_a : x }.flatten
    Array.new(len){ chars.sample }.join
  end

end

https://github.com/rubyworks/facets/blob/5569b03b4c6fd25897444a266ffe25872284be2b/lib/core/facets/string/random.rb

यह मेरे लिए ठीक काम करता है



1

array#shuffleरैंडमाइजेशन के लिए विधि आजमाएं

array = (1..10).to_a
array.shuffle.first

1
आप तो चाहिए एक पूरी सरणी बनाने के लिए, कम से कम की जगह .shuffle.firstके साथ .sample!
केमिली गौडेय्यून

0

आरएनजी को सरैंड () के साथ बीज देना न भूलें ।


2
यदि आप सरंड () नहीं कहते हैं तो क्या होता है?
एलेक्स बी

21
अगर यह पहले से ही नहीं बुलाया गया था तो सरंड को वर्तमान समय में बीज के साथ कहा जाता है।
जूलियन एच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.