提问人:Mark A. Nicolosi 提问时间:10/14/2008 最后编辑:techdreamsMark A. Nicolosi 更新时间:1/18/2023 访问量:569255
如何在 Ruby 中获取随机数
How to get a random number in Ruby
答:
好吧,我想通了。显然,有一个内置的 (?) 函数叫做 rand:
rand(n + 1)
如果有人回答了更详细的答案,我会将其标记为正确答案。
评论
使用 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]
注意:
使用(使用)通常不是一个好主意,正如 Marc-André Lafortune 在他的回答中(再次)详细解释的那样。
Random.new.rand(20..30)
Random.new
但是,如果您不使用 ,那么类方法
rand
只接受一个值,而不是 ,正如 banister(精力充沛地)在注释中指出的那样(以及Random
的文档中记录的)。只有实例方法可以接受 ,如生成一个 7 位数字的随机数所示。Random.new
max
Range
Range
这就是为什么 would 的等价物是 ,因为返回“一个大于或等于零且小于参数的随机整数”。 包括 30,我需要想出一个介于 0 和 11 之间的随机数,不包括 11。Random.new.rand(20..30)
20 + Random.rand(11)
Random.rand(int)
20..30
评论
Random.rand
实际上,确实接受一个范围。(我相信从 1.9.3 开始。
method(:rand)
#<Method: Object(Kernel)#rand>
rand
Kernel
Object
self.send(:rand, 0..10)
别忘了先用 srand() 为 RNG 播种。
评论
虽然你可以用它来获取一个介于 和 之间的随机数(其中 10 是包含的,42 是不含的),但自 Ruby 1.9.3 以来,有一种更好的方法可以调用:rand(42-10) + 10
10
42
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 .每次想要一个随机数时创建一个新的随机生成器是一个非常糟糕的主意。如果你这样做,你会得到初始种子设定算法的随机属性,与随机生成器本身的属性相比,这些属性是残酷的。rand
Random.rand
因此,如果使用 ,则应尽可能少地调用它,例如一次 as 并在其他任何地方使用它。Random.new
MyApp::Random = Random.new
有帮助的情况如下:Random.new
- 您正在编写一个 gem,并且不想干扰主程序可能依赖的 / 的顺序
rand
Random.rand
- 您需要单独的可重现的随机数序列(例如每个线程一个)
- 您希望能够保存和恢复可重现的随机数序列(就像对象可以编组一样简单)
Random
评论
backports
Random.rand(10..42)
不起作用。类方法不接受范围。(红宝石 1.9.2p180)Random.rand
这又如何呢?
n = 3
(0..n).to_a.sample
评论
rand
如果你不仅在寻找一个数字,而且还在寻找十六进制或uuid,值得一提的是,该模块在1.9.2+中找到了从ruby核心到ruby核心的途径。因此,不需要一个完整的框架:SecureRandom
ActiveSupport
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)
评论
SecureRandom.random_number(1000..9999)
SecureRandom.random_number()
不取范围,所以不。您可能想要类似(0-9999)或(1000-9999)之类的东西。SecureRandom.random_number(10_000)
SecureRandom.random_number(9_000)+1_000
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+)版本中可用。
评论
ruby 1.9.3+
1.9.2
您可以使用该方法生成随机数。传递给该方法的参数应为 an 或 a ,并在范围内返回相应的随机数: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
评论
rand(1..6)
rand(6)+1
此链接对此会有所帮助;
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
评论
.shuffle.first
.sample
问题的最简单答案:
rand(0..n)
你可以做 rand(range)
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
这对我来说效果很好
这个怎么样?
num = Random.new
num.rand(1..n)
范围 = 10..50
兰德(范围)
或
range.to_a.sample
或
range.to_a.shuffle(这将洗牌整个数组,你可以选择第一个或最后一个随机数,或者从这个数组中选择一个随机数来选择随机数)
评论
range.to_a.sample
当样本很大时,这是一个糟糕的主意。
您可以简单地使用 .random_number
如果正整数为 n,则返回一个整数:0 <= < n。random_number
random_number
像这样使用它:
any_number = SecureRandom.random_number(100)
输出将是 0 到 100 之间的任意数字。
在 ruby 中获取随机数的简单方法是,
def random
(1..10).to_a.sample.to_s
end
为此,您可以使用 ruby rand 方法,如下所示:
rand(n+1)
您需要使用 as rand 方法返回任何大于或等于 0 但小于传递的参数值的随机数。n+1
上一个:如何回滚特定迁移?
评论
srand <some_number>
rand