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

How to generate a random number between a and b in Ruby?

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

有没有更好的方法(比如rand(3, 10))?


更新:ruby 1.9.3Kernel#rand也接受范围

1
rand(a..b)

网址:http://www.rubyinside.com/ruby-1-9-3-introduction-and-changes-5428.html

转换为数组可能太贵,而且这是不必要的。

1
(a..b).to_a.sample

1
[*a..b].sample

阵列α样本

Ruby 1.8.7+中的标准。注:在1.8.7中被命名为choice,在较新版本中被重命名。

但是无论如何,生成数组需要资源,并且您已经编写的解决方案是最好的,您可以这样做。


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

其中,a是您的最低价值,b是您的最高价值。


1
rand(3..10)

核αrand

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


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

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

1
2
3
def random_int(min, max)
    rand(max - min) + min
end

10和10*24

1
rand(10**24-10)+10


请看这个答案:Ruby1.9.2中有,但在早期版本中没有。我个人认为兰德(8+3)是好的,但如果你感兴趣,请查看链接中描述的随机类。


这里是#sample#rand的快速基准:

1
2
3
4
5
6
7
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)是正确的。