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

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

有没有更好的方法来做到这一点(像rand(3, 10) )?

更新: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 

arrays#样品

在Ruby 1.8.7+标准。
注意:在1.8.7中被命名为#choice,并在更高版本中被重命名。

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

 Random.new.rand(a..b) 

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

 rand(3..10) 

内核#兰特

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

只要注意范围操作符之间的区别:

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

看到这个答案:有在Ruby 1.9.2中,但不是在早期版本。 我个人认为rand(8)+ 3是好的,但是如果你有兴趣的话可以查看链接中描述的Random类。

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

10和10 ** 24

 rand(10**24-10)+10 

这里是#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) 

所以,做兰德( 范围 )是正确的