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


嗯,我想通了。显然有一个内置(?)函数叫做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。


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


虽然您可以使用rand(42-10)+10来获得10到42之间的随机数(其中10是包含的,42是不包含的),但自Ruby 1.9.3以来,有一种更好的方法,您可以调用:

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

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

Ruby1.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的注释

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

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

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

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


这个呢?

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

如果您不仅要寻找数字,还要寻找十六进制或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)


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版本中可用。


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

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

此链接将对此有所帮助;

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

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

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

问题的最简单答案:

rand(0..n)

你可以做rand(范围)

x = rand(1..5)

也许这对你有帮助。我在应用程序中使用此功能

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

这对我来说很好


这个怎么样?

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

范围=10..50

兰特(范围)

or

采样范围

or

range.to_a.shuffle(这将对整个数组进行随机排序,您可以从这个数组中按第一个或最后一个或任意一个选择随机数)


您可以简单地使用random_number。

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

这样使用:

any_number = SecureRandom.random_number(100) 

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


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

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

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

rand(n+1)

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