如何在Ruby中生成a和b之间的随机数?

时间:2010-12-09 05:18:15

标签: ruby random range

例如,要生成3到10之间的随机数,我使用:rand(8) + 3

有没有更好的方法(类似rand(3, 10))?

8 个答案:

答案 0 :(得分:315)

更新:Ruby 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并在更高版本中重命名。

但无论如何,生成数组需要资源,而你已经编写的解决方案是最好的,你可以做到。

答案 1 :(得分:86)

Random.new.rand(a..b) 

a是您的最低值,b是您的最高值。

答案 2 :(得分:11)

rand(3..10)

Kernel#rand

  

当max是Range时,rand返回一个随机数,其中range.member?(number)== true。

答案 3 :(得分:10)

请注意范围运算符之间的区别:

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

答案 4 :(得分:3)

请参阅this回答:Ruby 1.9.2中有,但早期版本没有。我个人认为rand(8)+ 3很好,但如果你有兴趣,请查看链接中描述的Random类。

答案 5 :(得分:3)

10和10 ** 24

rand(10**24-10)+10

答案 6 :(得分:3)

def random_int(min, max)
    rand(max - min) + min
end

答案 7 :(得分: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)是正确的事情