如何在0
和之间生成随机数n
?
17 回答
来自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)
(usingRandom.new
) 通常不是一个好主意。但是,如果您不使用
Random.new
,则类方法rand
仅采用一个max
值,而不是 aRange
,正如栏杆(精力充沛地)在评论中指出的那样(并且如文档中所述)Random
。只有实例方法可以带aRange
,如生成一个7位随机数所示。
这就是为什么等价的Random.new.rand(20..30)
will be 20 + Random.rand(11)
,因为Random.rand(int)
返回“一个大于或等于零且小于参数的随机整数”。20..30
包括30,我需要拿出一个0到11之间的随机数,不包括11。
虽然您可以使用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
or Random.rand
。每次你想要一个随机数时创建一个新的随机生成器是一个非常糟糕的主意。如果这样做,您将获得初始播种算法的随机属性,与随机生成器本身的属性相比,这些属性非常糟糕。
如果您使用Random.new
,则应尽可能少地调用它,例如一次 asMyApp::Random = Random.new
并在其他任何地方使用它。
有帮助的情况Random.new
如下:
- 您正在编写 gem 并且不想干扰主程序可能依赖的
rand
/序列Random.rand
- 你想要单独的可重复的随机数序列(比如每个线程一个)
- 您希望能够保存和恢复可重现的随机数序列(很容易,因为
Random
可以编组对象)
如果您不仅要查找数字,还要查找 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"
您可以使用该方法生成一个随机数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
嗯,我想通了。显然有一个名为 rand 的内置 (?) 函数:
rand(n + 1)
如果有人回答更详细的答案,我会将其标记为正确答案。
那这个呢?
n = 3
(0..n).to_a.sample
最简单的问题答案:
rand(0..n)
您可以简单地使用random_number
.
如果给定一个正整数作为 n,则random_number
返回一个整数:0 <= random_number
< n。
像这样使用它:
any_number = SecureRandom.random_number(100)
输出将是 0 到 100 之间的任何数字。
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。
范围 = 10..50
兰特(范围)
或者
range.to_a.sample
或者
range.to_a.shuffle(这将打乱整个数组,您可以按第一个或最后一个或从该数组中的任何一个随机数来选择随机数)
你可以做 rand(range)
x = rand(1..5)
此链接将对此有所帮助;
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)}
在 ruby 中获取随机数的简单方法是,
def random
(1..10).to_a.sample.to_s
end
也许它对你有帮助。我在我的应用程序中使用它
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)
不要忘记先用srand()播种 RNG 。
尝试array#shuffle
随机化方法
array = (1..10).to_a
array.shuffle.first