如何在0
和n
之间生成随机数?
答案 0 :(得分:933)
如果您需要一个随机整数来模拟一个六面骰子的卷,您可以使用:
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)
(使用Random.new
)通常不是一个好主意,正如Marc-André Lafortune在his answer中再次详细解释的那样(再次) )。
但是,如果您不使用Random.new
,那么class method rand
只会将max
值而不是Range
作为banister (积极地)在评论中指出(并在docs for Random
中记录)。只有instance method可以使用Range
,如generate a random number with 7 digits所示。
这就是Random.new.rand(20..30)
的等效值为20 + Random.rand(11)
的原因,因为Random.rand(int)
返回“大于或等于零且小于参数的随机整数。“20..30
包含30,我需要提出0到11之间的随机数,不包括11。
答案 1 :(得分:582)
虽然您可以使用rand(42-10) + 10
获取10
和42
之间的随机数(其中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
在大多数情况下,最简单的方法是使用rand
或Random.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
方法的参数应为integer
或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
答案 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
它适用于我
答案 16 :(得分:0)
不要忘记先用 srand()为RNG播种。
答案 17 :(得分:0)
使用'rand'函数就像这样
rand(10)