如何在Ruby中获取随机数

How to get a random number in Ruby

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


使用rand(range)

从红宝石随机数:

If you needed a random integer to simulate a roll of a six-sided die, you'd use: 1 + rand(6). A roll in craps could be simulated with 2 + rand(6) + rand(6).

Finally, if you just need a random float, just call rand with no arguments.

正如Marc Andr_Lafuture在下面的回答中所提到的(去投票),Ruby 1.9.2有自己的Random类(Marc Andr_自己帮助调试,因此该功能的目标是1.9.2)。

例如,在这个需要猜测10个数字的游戏中,可以使用以下方法初始化它们:

1
2
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_Lafuture在他的回答(再次)中详细解释的那样。

  • 但是如果您不使用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个不包含),但有一种更好的方法,因为Ruby1.9.3可以调用:

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

通过需要我的backportsgem,可用于Ruby的所有版本。

Ruby1.9.2还引入了Random类,这样您就可以创建自己的随机数生成器对象,并有一个很好的API:

1
2
3
r = Random.new
r.rand(10...42) # => 22
r.bytes(3) # =>"rnd"

Random类本身充当随机生成器,因此直接调用:

1
Random.rand(10...42) # => same as rand(10...42)

关于Random.new的说明

在大多数情况下,最简单的方法是使用randRandom.rand。每次需要随机数时都创建一个新的随机生成器是一个非常糟糕的主意。如果这样做,您将得到初始种子设定算法的随机属性,与随机生成器本身的属性相比,这是非常糟糕的。

如果您使用Random.new,那么您应该尽可能少地称它为MyApp::Random = Random.new,并在其他地方使用它。

Random.new有帮助的情况如下:

  • 你正在写一个gem,不想干扰主程序可能依赖的randRandom.rand的顺序。
  • 您需要单独的随机数的可重复序列(例如每个线程一个)
  • 您希望能够保存和恢复一个可复制的随机数序列(就像Random对象可以编组一样简单)


如果您不仅在寻找一个数字,而且还在寻找十六进制或UUID,那么值得一提的是,SecureRandom模块在1.9.2+中找到了从ActiveSupport到ruby核心的方法。因此,不需要一个完整的框架:

1
2
3
4
5
6
7
8
9
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)


您可以使用rand方法生成随机数。传递给rand方法的参数应该是integerRange并返回一个在以下范围内的相应随机数:

1
2
3
4
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


好吧,我知道了。显然有一个内置的(?)函数名为rand:

1
rand(n + 1)

如果有人回答更详细的问题,我会把它标为正确答案。


这个怎么样?

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


问题的最简单答案:

1
rand(0..n)

范围=10…50

兰德(范围)

范围至样本

range.to-a.shuffle(这将对整个数组进行无序播放,您可以从该数组中按第一个或最后一个或任意选择一个随机数字来随机播放)


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

请注意,range选项仅在Ruby的较新版本(我相信是1.9以上)中可用。


您只需使用random_number

如果一个正整数被指定为n,那么random_number返回一个整数:0<=random_number

这样使用:

1
any_number = SecureRandom.random_number(100)

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


关于这一点,这个链接会很有帮助;

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

下面的Ruby中的随机数更清晰一些;

生成从0到10的整数

1
puts (rand() * 10).to_i

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

1
puts rand(10)

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

1
puts rand(10..15)

非随机随机数

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

1
srand(5)

生成10个随机数

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


你可以做兰德(范围)

1
x = rand(1..5)

也许这对你有帮助。我在我的应用程序中使用这个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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/5569b03b4c6fd2589744a26ffe2587284be2b/lib/core/facets/string/random.rb

对我来说很好


这个怎么样?

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

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

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

随机试验array#shuffle

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


像这样使用"rand"函数rand(10)


不要忘记先用srand()为rng种子。