811

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

4

17 回答 17

974

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

笔记:

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

于 2008-10-13T18:10:25.520 回答
601

虽然您可以使用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

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

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

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

  • 您正在编写 gem 并且不想干扰主程序可能依赖的rand/序列Random.rand
  • 你想要单独的可重复的随机数序列(比如每个线程一个)
  • 您希望能够保存和恢复可重现的随机数序列(很容易,因为Random可以编组对象)
于 2010-05-05T14:01:50.417 回答
47

如果您不仅要查找数字,还要查找 hex 或 uuid,那么值得一提的是,该SecureRandom模块ActiveSupport在 1.9.2+ 中找到了 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"

它记录在这里:Ruby 1.9.3 - 模块:SecureRandom (lib/securerandom.rb)

于 2012-07-20T11:15:10.923 回答
38

您可以使用该方法生成一个随机数rand。传递给rand方法的参数应该是 aninteger或 a range,并返回范围内对应的随机数:

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
于 2012-12-12T20:12:22.187 回答
22

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

rand(n + 1)

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

于 2008-10-13T18:10:10.107 回答
17

那这个呢?

n = 3
(0..n).to_a.sample
于 2012-05-23T06:02:22.813 回答
13

最简单的问题答案:

rand(0..n)
于 2015-02-19T18:53:15.537 回答
10

您可以简单地使用random_number.

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

像这样使用它:

any_number = SecureRandom.random_number(100) 

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

于 2017-01-16T11:58:57.663 回答
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​​。

于 2012-11-15T23:31:45.780 回答
6

范围 = 10..50

兰特(范围)

或者

range.to_a.sample

或者

range.to_a.shuffle(这将打乱整个数组,您可以按第一个或最后一个或从该数组中的任何一个随机数来选择随机数)

于 2016-04-29T10:32:32.767 回答
5

你可以做 rand(range)

x = rand(1..5)
于 2015-08-22T23:09:00.703 回答
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)}
于 2013-12-24T17:38:49.737 回答
4

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

def random    
  (1..10).to_a.sample.to_s
end
于 2017-02-16T10:04:47.597 回答
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

这对我来说可以

于 2016-03-11T13:59:43.713 回答
2

这个怎么样?

num = Random.new
num.rand(1..n)
于 2016-03-11T14:31:35.207 回答
1

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

于 2008-10-13T18:15:52.513 回答
1

尝试array#shuffle随机化方法

array = (1..10).to_a
array.shuffle.first
于 2015-01-23T17:42:50.217 回答