如何在Ruby中获得一个随机数字
如何生成0
到n
之间的随机数字?
使用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)
(使用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)
返回“一个大于或等于零且小于争论“ 20..30
包括30,我需要拿出一个0到11之间的随机数,不包括11。
虽然你可以使用rand(42-10) + 10
来获得一个10
到42
之间的随机数(其中10是包含的,42是独占的),但是从Ruby 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"
这里记录它:Ruby 1.9.3 - 模块:SecureRandom(lib / securerandom.rb)
链接地址: http://www.djcxy.com/p/17095.html上一篇: How to get a random number in Ruby
下一篇: Why isn't the eigenclass equivalent to self.class, when it looks so similar?