如何在 Ruby 中获取随机数

How to get a random number in Ruby

提问人:Mark A. Nicolosi 提问时间:10/14/2008 最后编辑:techdreamsMark A. Nicolosi 更新时间:1/18/2023 访问量:569255

问:

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

Ruby-on-Rails Ruby-on-Rails-4

评论

1赞 Purplejacket 2/21/2020
如果需要,在编写代码之前使用将为您提供确定性(即可重复)伪随机序列。ruby-doc.org/core-2.5.6/Random.html#method-c-srandsrand <some_number>rand

答:

22赞 Mark A. Nicolosi 10/14/2008 #1

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

rand(n + 1)

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

评论

2赞 Christoph Schiessl 10/14/2008
是的,它内置在内核模块中。
993赞 VonC 10/14/2008 #2

使用 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]

注意:

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

评论

2赞 Dan Rosenstark 1/27/2010
这不是非常不像红宝石吗?我以为一切都是一个物体,最不令人惊讶,而且......
1赞 Marc-André Lafortune 5/5/2010
@yar:有点“岌岌可危”。现在 Ruby 有它的 Random 类(见我的答案)
2赞 horseyguy 6/27/2011
@VonC啊:)对不起,如果我有点苛刻,那只是让我感到惊讶
1赞 Ajedi32 1/3/2015
Random.rand 实际上,确实接受一个范围。(我相信从 1.9.3 开始。
1赞 Eric Duminil 3/12/2018
@DanRosenstark:8年后...... 输出。因此,每个人都可以使用一种方法。如果它让你感觉好些,你可以打电话。method(:rand)#<Method: Object(Kernel)#rand>randKernelObjectself.send(:rand, 0..10)
1赞 Liebach 10/14/2008 #3

别忘了先用 srand() 为 RNG 播种。

评论

2赞 Alex B 10/17/2008
如果不调用 srand() 会发生什么?
21赞 Julian H 2/6/2010
如果尚未调用,则会自动调用 SRAND,种子来自当前时间。
610赞 Marc-André Lafortune 5/5/2010 #4

虽然你可以用它来获取一个介于 和 之间的随机数(其中 10 是包含的,42 是不含的),但自 Ruby 1.9.3 以来,有一种更好的方法可以调用:rand(42-10) + 101042

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

适用于所有版本的 Ruby,需要我的向后移植 gem。

Ruby 1.9.2 还引入了这个类,因此您可以创建自己的随机数生成器对象,并且有一个很好的 API:Random

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

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

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

关于Random.new的注意事项

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

因此,如果使用 ,则应尽可能少地调用它,例如一次 as 并在其他任何地方使用它。Random.newMyApp::Random = Random.new

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

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

评论

1赞 VonC 5/5/2010
非常好!+1.我已经完成了自己的答案来反映该新功能(并提及您对 Bug #3104 的贡献;))。
1赞 Marc-André Lafortune 5/5/2010
@yar:我的 gem 只是 RUby 1.8.7、1.9.1、1.9.2 中新方法的集合,但在 Ruby 中实现。我使用 RubySpec 来确保结果与 Ruby 兼容。backports
0赞 Dan Rosenstark 5/6/2010
@Marc-André Lafortune,谢谢你。由于速度要求,我总觉得很奇怪,有多少 Ruby 是在非 Ruby(C 或其他)中实现的。但他们是休息时间
5赞 horseyguy 6/27/2011
Random.rand(10..42)不起作用。类方法不接受范围。(红宝石 1.9.2p180)Random.rand
1赞 Marc-André Lafortune 6/27/2011
@banister:哇,我确信新的 api(带有范围、字节等的 rand)可以直接通过 Random 对象获得。带有范围的 rand 将在 1.9.3 中,我将对字节发出功能请求。我已经编辑了我的答案
17赞 Rimian 5/23/2012 #5

这又如何呢?

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

评论

3赞 Travis 2/23/2017
应该注意的是,生成像此解决方案提供的数字数组在大范围内的性能很差,因为它是 O(n) 而 O(1)。rand
48赞 Thomas Fankhauser 7/20/2012 #6

如果你不仅在寻找一个数字,而且还在寻找十六进制或uuid,值得一提的是,该模块在1.9.2+中找到了从ruby核心到ruby核心的途径。因此,不需要一个完整的框架:SecureRandomActiveSupport

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)

评论

0赞 onurozgurozkan 2/2/2014
如果您需要 4 位随机数怎么办?
1赞 JayTarka 8/9/2015
我猜是 onurozgurozkanSecureRandom.random_number(1000..9999)
1赞 mwp 10/28/2015
SecureRandom.random_number()不取范围,所以不。您可能想要类似(0-9999)或(1000-9999)之类的东西。SecureRandom.random_number(10_000)SecureRandom.random_number(9_000)+1_000
1赞 Jesse Farmer 6/26/2016
随机兰德(1000..9999)
6赞 Josh 11/16/2012 #7
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+)版本中可用。

评论

0赞 Batkins 12/14/2012
我相信范围选项仅在 .至少当我尝试时,它不起作用。ruby 1.9.3+1.9.2
39赞 user1389938 12/13/2012 #8

您可以使用该方法生成随机数。传递给该方法的参数应为 an 或 a ,并在范围内返回相应的随机数:randrandintegerrange

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

评论

0赞 isomorphismes 6/12/2014
我认为使用您的阅读比顶部答案更清晰.rand(1..6)rand(6)+1
4赞 Sam 12/25/2013 #9

此链接对此会有所帮助;

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)}

评论

0赞 Sam 12/25/2013
您也可以关注此博客,逐步非常清晰地了解红宝石中的随机编号;sitepoint.com/tour-random-ruby
1赞 LuckyElf 1/24/2015 #10

随机化的尝试方法array#shuffle

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

评论

1赞 Camille Goudeseune 9/19/2019
如果必须创建整个数组,请至少替换为 !.shuffle.first.sample
15赞 sqrcompass 2/20/2015 #11

问题的最简单答案:

rand(0..n)
5赞 Scott 8/23/2015 #12

你可以做 rand(range)

x = rand(1..5)
2赞 amarradi 3/11/2016 #13

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

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

这对我来说效果很好

2赞 Juan Dela Cruz 3/11/2016 #14

这个怎么样?

num = Random.new
num.rand(1..n)
6赞 sumit 4/29/2016 #15

范围 = 10..50

兰德(范围)

range.to_a.sample

range.to_a.shuffle(这将洗牌整个数组,你可以选择第一个或最后一个随机数,或者从这个数组中选择一个随机数来选择随机数)

评论

1赞 Greg 5/21/2019
range.to_a.sample当样本很大时,这是一个糟糕的主意。
11赞 techdreams 1/16/2017 #16

您可以简单地使用 .random_number

如果正整数为 n,则返回一个整数:0 <= < n。random_numberrandom_number

像这样使用它:

any_number = SecureRandom.random_number(100) 

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

4赞 Vaisakh VM 2/16/2017 #17

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

def random    
  (1..10).to_a.sample.to_s
end
0赞 Sachin Singh 1/18/2023 #18

为此,您可以使用 ruby rand 方法,如下所示:

rand(n+1)

您需要使用 as rand 方法返回任何大于或等于 0 但小于传递的参数值的随机数。n+1