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