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


189

3 और 10 के बीच एक यादृच्छिक संख्या उत्पन्न करने के लिए, उदाहरण के लिए, मैं उपयोग करता हूं: rand(8) + 3

क्या ऐसा करने का एक अच्छा तरीका है (कुछ इस तरह rand(3, 10))?


4
def my_rand(x, y); rand(y - x) + x; end
थियो

@ थियो, y - x + 1वैसे।
नकीलोन

1
अपना सही उत्तर १० और १० ** २४ को सीमा के रूप में आज़माएं: ० बहुत लंबी प्रतीक्षा होगी :)
सायन मलक्षिनोव

5
यह काम करता है:rand(3..10)
eikes

जवाबों:


324

अद्यतन: रूबी 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 नाम दिया गया था और बाद के संस्करणों में नाम दिया गया था।

लेकिन फिर भी, सरणी बनाने के लिए संसाधनों की आवश्यकता होती है, और आपके द्वारा पहले से लिखा गया समाधान सबसे अच्छा है, आप कर सकते हैं।


धन्यवाद! मुझे लगता है कि मैं पुराने और अच्छे तरीके के साथ
रहूंगा

32
यह एक बहुत बुरा विचार है, खासकर अगर आपके ए और बी अज्ञात आकार के हैं। प्रयास करें (100000000000000000..100000000000000) .to_a.sample और देखें कि मेरा क्या मतलब है
:)

4
@pixelearth, यदि आपके पास बेहतर विचार है, जो प्रश्न को हल करता है, तो आपका स्वागत है।
नैकिलोन

rand(a..b)काम नहीं करता है, यह विभाजन करता है TypeError: can't convert Range into Integer:। यह रूबी 2.0
fguillen

2
@fguillen यह मेरे लिए 1.9.3 में काम करता है, मुझे नहीं पता कि यह आपके लिए काम क्यों नहीं कर रहा है।
माइकल डोरस्ट

87
Random.new.rand(a..b) 

aआपका सबसे कम मूल्य कहां है और bआपका उच्चतम मूल्य है।


4
नोट करने के लिए महत्वपूर्ण अंतर यह है कि यदि आप सिर्फ कॉल rand()करते हैं तो आप कॉल कर रहे हैं Kernel#rand, जो केवल एक maxतर्क का समर्थन करता है । यदि आप एक सीमा पास करना चाहते हैं, तो आपको इसका उपयोग करना होगा Random#rand, मतलब आपको इस तरह से लागू करना होगा। +1
ग्रम्पिट 3

2
जोड़ना चाहिए कि उपरोक्त 1.9.2 पर लागू होता है
grumpit

क्या इसमें a और b शामिल हैं?
अभिदीप



3

इस उत्तर को देखें : रूबी 1.9.2 में है, लेकिन पहले के संस्करणों में नहीं है। व्यक्तिगत रूप से मुझे लगता है कि रैंड (8) + 3 ठीक है, लेकिन यदि आप रुचि रखते हैं तो लिंक में वर्णित रैंडम वर्ग की जांच करें।




2

और यहाँ दोनों के लिए एक त्वरित बेंचमार्क है #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)सही काम है

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