如何在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) (使用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来获得一个1042之间的随机数(其中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注释

    在大多数情况下,最简单的是使用randRandom.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?