3 और 10 के बीच एक यादृच्छिक संख्या उत्पन्न करने के लिए, उदाहरण के लिए, मैं उपयोग करता हूं: rand(8) + 3
क्या ऐसा करने का एक अच्छा तरीका है (कुछ इस तरह rand(3, 10)
)?
y - x + 1
वैसे।
rand(3..10)
3 और 10 के बीच एक यादृच्छिक संख्या उत्पन्न करने के लिए, उदाहरण के लिए, मैं उपयोग करता हूं: rand(8) + 3
क्या ऐसा करने का एक अच्छा तरीका है (कुछ इस तरह rand(3, 10)
)?
y - x + 1
वैसे।
rand(3..10)
जवाबों:
अद्यतन: रूबी 1.9.3 Kernel#rand
भी पर्वतमाला स्वीकार करता है
rand(a..b)
http://www.rubyinside.com/ruby-1-9-3-introduction-and-changes-5428.html
सरणी में परिवर्तित करना बहुत महंगा हो सकता है, और यह अनावश्यक है।
(a..b).to_a.sample
या
[*a..b].sample
रूबी 1.8.7+ में मानक।
नोट: 1.8.7 में #choice नाम दिया गया था और बाद के संस्करणों में नाम दिया गया था।
लेकिन फिर भी, सरणी बनाने के लिए संसाधनों की आवश्यकता होती है, और आपके द्वारा पहले से लिखा गया समाधान सबसे अच्छा है, आप कर सकते हैं।
Random.new.rand(a..b)
a
आपका सबसे कम मूल्य कहां है और b
आपका उच्चतम मूल्य है।
rand()
करते हैं तो आप कॉल कर रहे हैं Kernel#rand
, जो केवल एक max
तर्क का समर्थन करता है । यदि आप एक सीमा पास करना चाहते हैं, तो आपको इसका उपयोग करना होगा Random#rand
, मतलब आपको इस तरह से लागू करना होगा। +1
rand(3..10)
जब अधिकतम एक रेंज होता है, तो रैंड एक यादृच्छिक संख्या देता है जहां रेंज। जमा (संख्या) == सच है।
बस रेंज ऑपरेटरों के बीच अंतर पर ध्यान दें:
3..10 # includes 10
3...10 # doesn't include 10
और यहाँ दोनों के लिए एक त्वरित बेंचमार्क है #sample
और #rand
:
irb(main):014:0* Benchmark.bm do |x|
irb(main):015:1* x.report('sample') { 1_000_000.times { (1..100).to_a.sample } }
irb(main):016:1> x.report('rand') { 1_000_000.times { rand(1..100) } }
irb(main):017:1> end
user system total real
sample 3.870000 0.020000 3.890000 ( 3.888147)
rand 0.150000 0.000000 0.150000 ( 0.153557)
तो, rand(a..b)
सही काम है
def my_rand(x, y); rand(y - x) + x; end