2009-11-10 9 views
31

के बीच एक सीमा में यादृच्छिक फ्लोट को सर्वश्रेष्ठ तरीके से कैसे बनाया जाए, मुझे पता है कि मैं रैंड (अधिकतम) के साथ यादृच्छिक फ्लोट उत्पन्न कर सकता हूं। मैंने एक सीमा में एक फ्लोट उत्पन्न करने की कोशिश की, यह मुश्किल नहीं होना चाहिए। लेकिन उदाहरण रैंड (1.4512) 0 लौटाता है, इस प्रकार रैंड फ्लोट के साथ गणना नहीं कर रहा है। अब मैंने थोड़ी सी चाल की कोशिश की, चीज़ को एक पूर्णांक में परिवर्तित कर दिया और मेरी वांछित सीमा में एक फिटिंग नंबर को यादृच्छिक बनाने के बाद, इसे वापस एक फ्लोट पर गणना कर रहा है .. जो काम नहीं कर रहा है।दो फ्लोट्स

मेरा प्रश्न यह है कि इसे बेहतर तरीके से कैसे करें। यदि कोई बेहतर तरीका नहीं है, तो यह क्यों काम नहीं कर रहा है? (शायद यह मेरे लिए बहुत देर हो चुकी है, मुझे 2 घंटे पहले सोना शुरू करना चाहिए था ..)। पूरी बात का उद्देश्य डाटाबेस रिकॉर्ड्स के लिए "स्थिति" फ़ील्ड की गणना करने के लिए एक तरीका होना है ताकि उपयोगकर्ता उन्हें मैन्युअल रूप से ऑर्डर कर सकें। मैंने पहले ऐसा कुछ नहीं किया है, शायद कोई मुझे बेहतर समाधान के साथ संकेत दे सकता है।

यहाँ अब तक कोड है:

def calculate_position(@elements, index) 
    min = @elements[index].position 

    if @elements[index + 1].nil? 
     pos = min + 1 
    else 
     pos = min + (rand(@elements[index + 1].position * 10000000000)/10000000000) 
    end 

    return pos 
end 

धन्यवाद!

+0

(रूबी 2.1 के साथ परीक्षण किया गया) नीचे दिए गए उत्तर अस्वीकार्य हैं, तो आप कृपया समस्या को स्पष्ट कर सकता है? – Josh

+0

सभी को उनके उत्तरों के लिए धन्यवाद, साफ और अच्छी तरह से समझाया – pduersteler

+0

@ sandor_bedo का जवाब शायद यहां सबसे अच्छा है: 'रैंड (-34.0..53।8) ' – Automatico

उत्तर

38

आइए संक्षिप्त:

रैंड() एक (psuedo-) 0 और 1.

रैंड (पूर्णांक) के बीच यादृच्छिक नाव उत्पन्न होगा एक (psuedo-) के बीच यादृच्छिक पूर्णांक उत्पन्न होगा 0 और int।

तो जैसे कुछ:

def range (min, max) 
    rand * (max-min) + min 
end 

अच्छी तरह से करना चाहिए।

अद्यतन:

बस एक छोटी सी इकाई परीक्षण के साथ परीक्षण किया:

def testRange 
    min = 1 
    max = 100 

    1_000_000.times { 
     result = range min, max 
     print "ERROR" if result < min || result > max 
    } 
end 

ठीक लग रहा है।

+0

JRuby में रूबी 1.9.3 की यादृच्छिक श्रेणियों को लागू करने का एक तरीका ढूंढ रहा था। यह बहुत अच्छा काम करता है! – KChaloux

3

मुझे लगता है कि आपका सर्वश्रेष्ठ दांव रैंड() का उपयोग करने के 0 और 1 के बीच एक यादृच्छिक नाव उत्पन्न करने के लिए, और उसके बाद सीमा निर्धारित करने के गुणा और जोड़ने के सेट करने के लिए ऑफसेट है:

def float_rand(start_num, end_num=0) 
    width = end_num-start_num 
    return (rand*width)+start_num 
end 

नोट: के बाद से शर्तों का क्रम कोई फर्क नहीं पड़ता, 0 को end_num डिफ़ॉल्ट बनाने से आपको फ्लोट_रेंड (x) के साथ 0 और x के बीच यादृच्छिक फ्लोट मिल सकता है।

10

1.9 और 2.0 आप रैंड करने के लिए एक श्रेणी तर्क दे सकते हैं:

irb(main):001:0> 10.times { puts rand Math::E..Math::PI } 
3.0656267148715446 
2.7813979580609587 
2.7661725184200563 
2.9745784681934655 
2.852157154320737 
2.741063222095785 
2.992638029938756 
3.0713152547478866 
2.879739743508003 
2.7836491029737407 
=> 10 
+0

यह बेहतर जवाब है। – Automatico

61

rand

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

rand(11.2...76.9) 

+0

यह सही उत्तर है। विशेष रूप से, रूबी दस्तावेज़ों से: "जब [दिया गया] एक 'रेंज' दिया जाता है, 'रैंड' एक यादृच्छिक संख्या देता है जहां' range.member? (संख्या) == सत्य' "। – omnikron

+0

यह स्वीकार्य उत्तर होना चाहिए! – gregblass

संबंधित मुद्दे