协慌网

登录 贡献 社区

如何在 Ruby 中获取随机数

如何生成0n之间的随机数?

答案

使用rand(range)

来自Ruby 随机数

如果你需要一个随机整数来模拟一个六面骰子的卷,你可以使用: 1 + rand(6) 。可以使用2 + rand(6) + rand(6)模拟掷骰子。

最后,如果你只需要一个随机浮点数,只需调用没有参数的rand


正如Marc-AndréLafortune下面的回答中提到的那样( 上升 它)Ruby 1.9.2 有自己的Random (Marc-André 自己帮助调试 ,因此该功能的1.9.2 目标 )。

例如,在这个你需要猜测 10 个数字的游戏中 ,你可以用以下方法初始化它们:

10.times.map{ 20 + Random.rand(11) } 
#=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22]

注意:

这就是为什么Random.new.rand(20..30)的等价物将是20 + Random.rand(11) ,因为Random.rand(int)返回 “大于或等于零且小于 0 的随机整数”。参数 。“ 20..30包括 30,我需要提出一个 0 到 11 之间的随机数,不包括 11。

虽然你可以使用rand(42-10) + 10获得之间的随机数1042 (其中 10 是包容性和排他性 42),有自红宝石 1.9.3,您可以拨打其中一个更好的方法:

rand(10...42) # => 13

适用于所有版本的 Ruby,需要我的backports gem。

Ruby 1.9.2 还引入了Random类,因此您可以创建自己的随机数生成器对象并具有一个很好的 API:

r = Random.new
r.rand(10...42) # => 22
r.bytes(3) # => "rnd"

Random类本身充当随机生成器,因此您可以直接调用:

Random.rand(10...42) # => same as rand(10...42)

关于Random.new注释

在大多数情况下,最简单的方法是使用randRandom.rand 。每次想要一个随机数时创建一个新的随机生成器是一个非常糟糕的主意 。如果这样做,您将获得初始种子算法的随机属性,这些属性与随机生成器本身的属性相比是非常糟糕的。

如果你使用Random.new ,你应该尽可能少地调用它,例如一次作为MyApp::Random = Random.new并在其他地方使用它。

Random.new有用的情况如下:

  • 你正在写一个 gem 并且不想干扰rand / Random.rand的顺序,主程序可能依赖于
  • 你想要单独的可重复的随机数序列(比如每个线程一个)
  • 您希望能够保存和恢复可重现的随机数序列(就像Random对象可以编组一样简单)

如果您不仅要寻找一个数字而且还要寻求十六进制或 uuid,那么值得一提的是SecureRandom模块从ActiveSupportActiveSupport中的 ruby 核心。所以不需要一个完整的框架:

require 'securerandom'

p SecureRandom.random_number(100) #=> 15
p SecureRandom.random_number(100) #=> 88

p SecureRandom.random_number #=> 0.596506046187744
p SecureRandom.random_number #=> 0.350621695741409

p SecureRandom.hex #=> "eb693ec8252cd630102fd0d0fb7c3485"

它在此处记录: Ruby 1.9.3 - 模块:SecureRandom(lib / securerandom.rb)