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

209
为了生成一个介于3和10之间的随机数,例如,我使用以下代码:rand(8) + 3 有没有更好的方法来实现这个(类似于rand(3, 10))?

4
def my_rand(x, y) rand(y - x) + x end这段代码的作用是生成在xy之间的一个随机整数,包括xy - Theo
@Theo,顺便说一下,y - x + 1 - Nakilon
1
请尝试在10和10 ** 24作为限制条件下输入正确答案:0将非常非常长等待 :) - Sayan Malakshinov
6
这个可以运行:rand(3..10) - eikes
8个回答

355

更新: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,后来改名了。

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


34
这是一个非常糟糕的想法,特别是当a和b的大小未知时。尝试使用(100000000000000000..100000000000000).to_a.sample,你就会明白我的意思:) - pixelearth
4
@pixelearth,如果你有更好的想法符合问题要求,欢迎发表。 - Nakilon
2
@fguillen,这在1.9.3版本中对我有效,我不知道为什么它对你无效。 - Michael Dorst
@anthropomorphic 在我的 ruby 2.0.0-p247 上可以工作,所以我撤回之前的说法。 - fguillen
@so_mv 这在MRI上不会发生。(2.0.0p594)。1000000.times{|i| a = rand(1000..9999); puts a if a < 1000}没有输出任何一个数字。 - Pelle
显示剩余3条评论

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

其中 a 为您的最小值,b 为您的最大值。


4
需要注意的重要区别是,如果你只调用 rand(),那么你调用的是 Kernel#rand,它仅支持一个 max 参数。如果你想传递一个范围,你必须使用 Random#rand,也就是说你必须按照这种方式实现。+1 - grumpit
2
应该补充说明以上内容适用于1.9.2版本。 - grumpit
它包括a和b吗? - Abhradip

13
rand(3..10)

Kernel#rand

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


13
你可以使用范围运算符。请注意两种形式之间的区别:
3..10  # includes 10
3...10 # doesn't include 10

这可能更适合作为评论而不是答案,但这也是一个非常重要的区别,所以我还是点了赞。 :) - Joshua Pinter

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

3

请参考这个答案:Ruby 1.9.2版本中有,但之前的版本没有。个人认为rand(8) + 3就可以了,但如果你感兴趣,可以查看链接中描述的Random类。


3

对于10和10**24

rand(10**24-10)+10

3
只需输入“rand(10..10**24)”即可。 - Michael Dorst

3

以下是对#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)是正确的做法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接