来自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)
(使用Random.new
)通常不是一个好主意,正如Marc-AndréLafortune (再次)在他的回答 (再次)中详细解释的那样。
但是如果你不使用Random.new
,那么类方法rand
只需要一个max
,而不是一个Range
,因为条形码 (能量)在注释中指出(并且在Random
文档中有记录)。只有实例方法可以采用Range
,如生成 7 位数的随机数所示。
这就是为什么Random.new.rand(20..30)
的等价物将是20 + Random.rand(11)
,因为Random.rand(int)
返回 “大于或等于零且小于 0 的随机整数”。参数 。“ 20..30
包括 30,我需要提出一个 0 到 11 之间的随机数,不包括 11。
虽然你可以使用rand(42-10) + 10
获得之间的随机数10
和42
(其中 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
注释
在大多数情况下,最简单的方法是使用rand
或Random.rand
。每次想要一个随机数时创建一个新的随机生成器是一个非常糟糕的主意 。如果这样做,您将获得初始种子算法的随机属性,这些属性与随机生成器本身的属性相比是非常糟糕的。
如果你使用Random.new
,你应该尽可能少地调用它,例如一次作为MyApp::Random = Random.new
并在其他地方使用它。
Random.new
有用的情况如下:
rand
/ Random.rand
的顺序,主程序可能依赖于Random
对象可以编组一样简单) 如果您不仅要寻找一个数字而且还要寻求十六进制或 uuid,那么值得一提的是SecureRandom
模块从ActiveSupport
到ActiveSupport
中的 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"