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

qybjjes1  于 2023-01-30  发布在  Ruby
关注(0)|答案(8)|浏览(306)

例如,要生成一个3到10之间的随机数,我用途:rand(8) + 3
有没有更好的方法来实现这一点(比如rand(3, 10))?

mqkwyuun

mqkwyuun1#

更新: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,在以后的版本中被重命名。*
但无论如何,生成数组需要资源,而你已经写好的解决方案是最好的,你可以做到。

nmpmafwu

nmpmafwu2#

Random.new.rand(a..b)

其中a是最低值,b是最高值。

lrl1mhuk

lrl1mhuk3#

可以使用范围运算符。请注意这两种形式的区别:

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

83qze16e4#

rand(3..10)

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

k75qkfdt

k75qkfdt5#

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

68bkxrlz6#

参见this答案:在Ruby 1.9.2中有,但在早期版本中没有。我个人认为兰德(8)+ 3很好,但如果你感兴趣,请查看链接中描述的Random类。

zzoitvuj

zzoitvuj7#

对于10和10**24

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

1szpjjfi8#

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

相关问题