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


189

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

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


4
def my_rand(x, y); rand(y - x) + x; end
Theo 2010年

@Theo,y - x + 1顺便说一句。
Nakilon 2010年

1
在10和10 ** 24上尝试正确的答案,因为限制:0将非常漫长::
xt.and.r

5
这有效:rand(3..10)
eikes 2015年

Answers:


323

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

数组#样本

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

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


谢谢!我认为我会继续使用旧的好方法:)
Misha Moroshko 2010年

32
这是一个非常糟糕的主意,特别是如果a和b的大小未知时。尝试(100000000000000000..100000000000000).to_a.sample,看看我的意思是
:)

4
@pixelearth,如果您有更好的主意,并且符合您的问题,欢迎发布。
Nakilon 2011年

rand(a..b)不工作,它分裂:TypeError: can't convert Range into IntegerRuby 2.0
2013年

2
@fguillen它在1.9.3中对我有效,我不知道为什么它对您不起作用。
迈克尔·多斯特

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

a最低值在哪里,b最高值在哪里。


4
需要注意的重要区别是,如果您仅调用rand(),则在调用Kernel#rand,它仅支持一个max参数。如果要传递范围,则必须使用Random#rand,这意味着必须以这种方式实现。+1
grumpit

2
应该补充说,以上适用于1.9.2
grumpit

它包括a和b吗?
Abhradip

12
rand(3..10)

内核#rand

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



3

请参见以下答案:Ruby 1.9.2中提供了此功能,但早期版本中没有。我个人认为rand(8)+ 3很好,但是如果您有兴趣,请查看链接中描述的Random类。




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)是正确的事

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.