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

Posted

技术标签:

【中文标题】如何在 Ruby 中生成 a 和 b 之间的随机数?【英文标题】:How to generate a random number between a and b in Ruby? 【发布时间】:2011-05-22 15:49:52 【问题描述】:

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

有没有更好的方法来做到这一点(比如rand(3, 10))?

【问题讨论】:

def my_rand(x, y); rand(y - x) + x; end @Theo,y - x + 1,顺便说一句。 在 10 和 10**24 上尝试你的正确答案,因为限制:0 将等待很长时间 :) 这工作:rand(3..10) 【参考方案1】:

更新: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,并在以后的版本中重命名。

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

【讨论】:

谢谢!我想我会继续使用旧的和好的方法:) 这是一个非常糟糕的主意,尤其是如果您的 a 和 b 大小未知。试试 (100000000000000000..100000000000000).to_a.sample 看看我的意思:) @pixelearth,如果你有更好的想法,符合问题,欢迎发帖。 rand(a..b) 不起作用,它会分裂:TypeError: can't convert Range into Integer。 Ruby 2.0 甚至不支持它 @fguillen 它在 1.9.3 中对我有用,我不知道为什么它对你不起作用。【参考方案2】:
Random.new.rand(a..b) 

a 是您的最低值,b 是您的最高值。

【讨论】:

需要注意的重要区别是,如果您只是调用rand(),那么您调用的是Kernel#rand,它只支持max 参数。如果你想传递一个范围,你必须使用Random#rand,这意味着你必须以这种方式实现。 +1 应该补充一下,以上适用于1.9.2 是否包含a和b?【参考方案3】:
rand(3..10)

Kernel#rand

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:
def random_int(min, max)
    rand(max - min) + min
end

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

对于 10 和 10**24

rand(10**24-10)+10

【讨论】:

或者只是rand(10..10**24)【参考方案8】:

这里是#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) 是正确的做法

【讨论】:

以上是关于如何在 Ruby 中生成 a 和 b 之间的随机数?的主要内容,如果未能解决你的问题,请参考以下文章

ruby 在ruby中生成随机字符串

如何在excel中生成一个在一定范围内的随机数

如何在 Bash 中生成随机数?

在 C++ 中生成随机双精度数

如何在 Matlab 中生成随机字符串?

如何在 C++ 中生成随机数?