2010-12-09 63 views
161

要產生3到10之間的隨機數,例如,我用:rand(8) + 3如何在Ruby中的a和b之間生成一個隨機數?

有沒有一個更好的辦法做到這一點(類似rand(3, 10))?

+4

`高清my_rand(X,Y); rand(y - x)+ x;結束' – Theo 2010-12-09 05:49:55

+0

@Theo,`y - x + 1`,順便說一句。 – Nakilon 2010-12-09 07:01:28

+1

試試你的正確答案10和10 ** 24作爲限制:0將會非常非常長awaitng :) – 2010-12-09 07:19:20

回答

270

UPDATE:紅寶石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 

Array#sample

標準的Ruby 1.8.7+。
注意:在1.8.7中命名爲#choice,並在更高版本中重命名。

但無論如何,生成數組需要的資源,和你已經寫的解決方案是最好的,你可以做。

3

請參閱this回答:在Ruby 1.9.2中有,但在早期版本中沒有。我個人認爲rand(8)+ 3很好,但如果你有興趣查看鏈接中描述的Random類。

2

對於10和10 ** 24

rand(10**24-10)+10 
81
Random.new.rand(a..b) 

哪裏a是你的最低值和b是你的最高值。

3
def random_int(min, max) 
    rand(max - min) + min 
end 
11
rand(3..10) 

Kernel#rand

When max is a Range, rand returns a random number where range.member?(number) == true.

7

剛剛記下的範圍內運營商之間的區別:

3..10 # includes 10 
3...10 # doesn't include 10 
1

這裏是兩個#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) 

所以,做蘭特(範圍)是正確的事情

相關問題