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


当前回答

如果您不仅要寻找数字,还要寻找十六进制或uuid,那么值得一提的是,SecureRandom模块在1.9.2+中找到了从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"

它记录在这里:Ruby1.9.3-模块:SecureRandom(lib/SecureRandom.rb)

其他回答

在ruby中获取随机数的简单方法是,

def random    
  (1..10).to_a.sample.to_s
end

嗯,我想通了。显然有一个内置(?)函数叫做rand:

rand(n + 1)

如果有人回答了更详细的答案,我会将其标记为正确答案。

使用rand(范围)

来自Ruby随机数:

如果你需要一个随机整数来模拟一个六面骰子,你可以使用:1+rand(6)。掷骰子可以用2+rand(6)+rand(4)模拟。最后,如果你只需要一个随机浮点数,只需要调用rand而不需要参数。


正如Marc AndréLafortune在下面的回答中所提到的(请投票),Ruby 1.9.2有自己的Random类(Marc Andreé亲自帮助调试,因此该特性的目标是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只接受一个最大值,而不是一个Range,正如banister(大力)在注释中指出的(以及Random的文档中所记录的)。只有实例方法可以采用Range,如生成7位数的随机数所示。

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

您可以简单地使用random_number。

如果给定正整数为n,random_number返回一个整数:0<=random_nnumber<n。

这样使用:

any_number = SecureRandom.random_number(100) 

输出将是0到100之间的任何数字。

尝试array#shuffle方法进行随机化

array = (1..10).to_a
array.shuffle.first