如何在Ruby中获取随机数

时间:2008-10-13 18:07:24

标签: ruby-on-rails ruby random secure-random

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

18 个答案:

答案 0 :(得分:933)

使用rand(range)

来自Ruby Random Numbers

  

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

     

最后,如果您只需要一个随机浮动,只需调用rand,不要参数。


正如Marc-André Lafortune his answer below (go upvote it)中提到Ruby 1.9.2 has its own Random class一样(Marc-André本人helped to debug,因此该1.9.2 target为该功能)。

例如,在此game where you need to guess 10 numbers中,您可以使用以下内容对其进行初始化:

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)返回“大于或等于零且小于参数的随机整数。“20..30包含30,我需要提出0到11之间的随机数,不包括11。

答案 1 :(得分:582)

虽然您可以使用rand(42-10) + 10获取1042之间的随机数(其中10包含且包含42),但是自Ruby 1.9.3以来有更好的方法你可以打电话:

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

通过要求我的backports gem,可用于所有版本的Ruby。

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 generator itself的属性相比非常恶劣。

如果您使用Random.new,则应尽可能少地将其称为 ,例如MyApp::Random = Random.new一次,并在其他地方使用它。

Random.new有用的案例如下:

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

答案 2 :(得分:45)

如果你不只是寻找一个数字而且还是十六进制或uuid,值得一提的是SecureRandom模块从ActiveSupport到1.9.2+中的红宝石核心。所以不需要一个完整的框架:

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 - Module: SecureRandom (lib/securerandom.rb)

答案 3 :(得分:35)

您可以使用rand方法生成随机数。传递给rand方法的参数应为integerrange,并返回范围内的相应随机数:

rand(9)       # this generates a number between 0 to 8
rand(0 .. 9)  # this generates a number between 0 to 9
rand(1 .. 50) # this generates a number between 1 to 50
#rand(m .. n) # m is the start of the number range, n is the end of number range

答案 4 :(得分:21)

好吧,我明白了。显然有一个内置(?)函数叫做rand:

rand(n + 1)

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

答案 5 :(得分:18)

这个怎么样?

n = 3
(0..n).to_a.sample

答案 6 :(得分:12)

最简单的答案:

rand(0..n)

答案 7 :(得分:6)

rand(6)    #=> gives a random number between 0 and 6 inclusively 
rand(1..6) #=> gives a random number between 1 and 6 inclusively

请注意,范围选项仅适用于较新的(1.9+我相信)版本的ruby。

答案 8 :(得分:6)

范围= 10..50

<强>兰特(范围)

<强> range.to_a.sample

range.to_a.shuffle (这会对整个数组进行随机播放,你可以先选择一个随机数,也可以从这个数组中随机选择一个随机数)

答案 9 :(得分:5)

您只需使用random_number

如果给定正整数为n,则random_number返回一个整数:0&lt; = random_number&lt; Ñ

像这样使用:

any_number = SecureRandom.random_number(100) 

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

答案 10 :(得分:4)

此链接对此有用;

http://ruby-doc.org/core-1.9.3/Random.html

还有一些关于红宝石中随机数的清晰度;

生成0到10之间的整数

puts (rand() * 10).to_i

生成0到10之间的数字 以更易读的方式

puts rand(10)

生成10到15之间的数字 包括15

puts rand(10..15)

非随机随机数

每次都生成相同的数字序列 程序运行

srand(5)

生成10个随机数

puts (0..10).map{rand(0..10)}

答案 11 :(得分:4)

你可以做rand(范围)

x = rand(1..5)

答案 12 :(得分:2)

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

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

答案 13 :(得分:2)

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

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

答案 14 :(得分:2)

这个怎么样?

num = Random.new
num.rand(1..n)

答案 15 :(得分:2)

也许它可以帮到你。我在我的应用程序中使用它

https://github.com/rubyworks/facets
class String

  # Create a random String of given length, using given character set
  #
  # Character set is an Array which can contain Ranges, Arrays, Characters
  #
  # Examples
  #
  #     String.random
  #     => "D9DxFIaqR3dr8Ct1AfmFxHxqGsmA4Oz3"
  #
  #     String.random(10)
  #     => "t8BIna341S"
  #
  #     String.random(10, ['a'..'z'])
  #     => "nstpvixfri"
  #
  #     String.random(10, ['0'..'9'] )
  #     => "0982541042"
  #
  #     String.random(10, ['0'..'9','A'..'F'] )
  #     => "3EBF48AD3D"
  #
  #     BASE64_CHAR_SET =  ["A".."Z", "a".."z", "0".."9", '_', '-']
  #     String.random(10, BASE64_CHAR_SET)
  #     => "xM_1t3qcNn"
  #
  #     SPECIAL_CHARS = ["!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "=", "+", "|", "/", "?", ".", ",", ";", ":", "~", "`", "[", "]", "{", "}", "<", ">"]
  #     BASE91_CHAR_SET =  ["A".."Z", "a".."z", "0".."9", SPECIAL_CHARS]
  #     String.random(10, BASE91_CHAR_SET)
  #      => "S(Z]z,J{v;"
  #
  # CREDIT: Tilo Sloboda
  #
  # SEE: https://gist.github.com/tilo/3ee8d94871d30416feba
  #
  # TODO: Move to random.rb in standard library?

  def self.random(len=32, character_set = ["A".."Z", "a".."z", "0".."9"])
    chars = character_set.map{|x| x.is_a?(Range) ? x.to_a : x }.flatten
    Array.new(len){ chars.sample }.join
  end

end

https://github.com/rubyworks/facets/blob/5569b03b4c6fd25897444a266ffe25872284be2b/lib/core/facets/string/random.rb

它适用于我

答案 16 :(得分:0)

不要忘记先用 srand()为RNG播种。

答案 17 :(得分:0)

使用'rand'函数就像这样

rand(10)