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

Mis*_*hko 188 ruby random range

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

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

Nak*_*lon 320

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

rand(a..b)
Run Code Online (Sandbox Code Playgroud)

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

转换为数组可能太昂贵了,而且没必要.


(a..b).to_a.sample
Run Code Online (Sandbox Code Playgroud)

要么

[*a..b].sample
Run Code Online (Sandbox Code Playgroud)

阵列#样品

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

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

  • 这是一个非常糟糕的主意,特别是如果你的a和b大小不明.试试(100000000000000000..100000000000000).to_a.sample,看看我的意思:) (32认同)
  • `#sample`很好,但`rand(a..b)`是这样做的方法. (11认同)
  • @pixelearth,如果您有更好的想法,哪些符合问题,欢迎您发帖. (4认同)
  • @fguillen 它在 1.9.3 中对我有用,我不知道为什么它对你不起作用。 (2认同)

小智 86

Random.new.rand(a..b) 
Run Code Online (Sandbox Code Playgroud)

a您的最低值在哪里,b是您的最高价值.

  • 需要注意的重要区别是,如果你只是调用`rand()`,你就会调用`Kernel#rand`,它只支持`max`参数.如果你想传递一个范围,你必须使用`Random#rand`,这意味着你必须以这种方式实现.+1 (4认同)
  • 应该补充说,上述内容适用于1.9.2 (2认同)

Dor*_*ian 12

rand(3..10)
Run Code Online (Sandbox Code Playgroud)

内核#兰特

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


Yan*_*iss 10

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

3..10  # includes 10
3...10 # doesn't include 10
Run Code Online (Sandbox Code Playgroud)


Cha*_*eph 5

def random_int(min, max)
    rand(max - min) + min
end
Run Code Online (Sandbox Code Playgroud)