例如,要生成一个3到10之间的随机数,我用途:rand(8) + 3有没有更好的方法来实现这一点(比如rand(3, 10))?
rand(8) + 3
rand(3, 10)
mqkwyuun1#
更新:Ruby 1.9.3 Kernel#rand也接受范围
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
阵列编号样本
注意:在1.8.7中被命名为#choice,在以后的版本中被重命名。*但无论如何,生成数组需要资源,而你已经写好的解决方案是最好的,你可以做到。
nmpmafwu2#
Random.new.rand(a..b)
其中a是最低值,b是最高值。
a
b
lrl1mhuk3#
可以使用范围运算符。请注意这两种形式的区别:
3..10 # includes 10 3...10 # doesn't include 10
83qze16e4#
rand(3..10)
内核#兰德当max为Range时,兰德返回一个随机数,其中range.member?(number)== true。
k75qkfdt5#
def random_int(min, max) rand(max - min) + min end
68bkxrlz6#
参见this答案:在Ruby 1.9.2中有,但在早期版本中没有。我个人认为兰德(8)+ 3很好,但如果你感兴趣,请查看链接中描述的Random类。
zzoitvuj7#
对于10和10**24
rand(10**24-10)+10
1szpjjfi8#
下面是针对#sample和#rand的快速基准测试:
#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)是正确的做法
8条答案
按热度按时间mqkwyuun1#
更新:Ruby 1.9.3
Kernel#rand
也接受范围http://www.rubyinside.com/ruby-1-9-3-introduction-and-changes-5428.html
转换为数组的开销可能太大,而且没有必要。
或者
阵列编号样本
注意:在1.8.7中被命名为#choice,在以后的版本中被重命名。*
但无论如何,生成数组需要资源,而你已经写好的解决方案是最好的,你可以做到。
nmpmafwu2#
其中
a
是最低值,b
是最高值。lrl1mhuk3#
可以使用范围运算符。请注意这两种形式的区别:
83qze16e4#
内核#兰德
当max为Range时,兰德返回一个随机数,其中range.member?(number)== true。
k75qkfdt5#
68bkxrlz6#
参见this答案:在Ruby 1.9.2中有,但在早期版本中没有。我个人认为兰德(8)+ 3很好,但如果你感兴趣,请查看链接中描述的Random类。
zzoitvuj7#
对于10和10**24
1szpjjfi8#
下面是针对
#sample
和#rand
的快速基准测试:因此,采用
rand(a..b)
是正确的做法