2009-11-10 76 views
31

我知道我可以用rand(max)來產生隨機浮點數。我試圖在一個範圍內生成一個浮點數,這應該不難。但是例如rand(1.4512)返回0,因此rand不是用浮點數計算的。現在我嘗試了一些小技巧,將其轉換爲整數,然後在我想要的範圍內隨機化一個擬合數字,然後將其計算回浮點數。如何最好地創建一個隨機浮點數在兩個浮點數之間的範圍內

我的問題是如何以更好的方式做到這一點。如果沒有更好的辦法,爲什麼這個不工作? (也許這對我來說太遲了,我應該在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

如果下面的答案是不可接受的,請你澄清這個問題? – Josh 2009-11-11 04:47:53

+0

謝謝大家對他們的回答,乾淨和很好的解釋 – pduersteler 2009-11-11 06:55:54

+0

@ sandor_bedo的答案可能是這裏最好的:'rand(-34.0..53。8)' – Automatico 2014-02-20 15:21:17

回答

38

讓我們回顧一下:

蘭特()將產生一個(psuedo-)無規 浮子0和1

蘭特(INT)之間將生成之間的 (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中實現Ruby 1.9.3隨機範圍的方法。這很好用! – KChaloux 2012-06-30 03:13:00

3

我認爲最好的方法是使用RAND()來生成0和1之間的隨機浮動,然後乘以設定的範圍內,並加入到設置偏移:

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

注意:由於條件順序無關緊要,使得end_num默認爲0允許您使用float_rand(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 2014-02-20 15:18:50

61

傳遞一個範圍內浮動,以rand

如果你想「創造一個範圍內的隨機浮動兩個浮體之間「,只是通過一系列的浮標rand

rand(11.2...76.9) 

(測試用Ruby 2.1)

+0

這是正確的答案。具體來說,從紅寶石docs:「[給定]一個'Range','rand'返回一個隨機數,其中'range.member?(number)== true'」。 – omnikron 2017-09-14 09:06:20

+0

這應該是公認的答案! – gregblass 2018-01-26 13:33:31