Answers:
采用 rand(range)
如果您需要一个随机整数来模拟六边形骰子的卷,请使用:
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)
(使用Random.new
),一般不会是一个好主意,在详细解释(再次)马克-安德烈·Lafortune,在他的回答(再次)。
但是,如果您不使用Random.new
,则class方法rand
仅使用一个max
值,而不是Range
,因为banister(大力地)在注释中指出了该值(并在文档中针对Random
)。只有实例方法才能采用a Range
,如生成7位数字的随机数所示。
这就是为什么相当于Random.new.rand(20..30)
是20 + Random.rand(11)
,因为Random.rand(int)
回报“的随机整数大于或等于零且小于参数。” 20..30
包括30,我需要给出一个介于0和11之间的随机数(不包括11)。
Random
课程,但是Random.new
像您的示例中那样多次调用是一个很糟糕的主意。我已经编辑了答案以说明这一点。
Random.rand
确实接受范围。(我相信,自1.9.3起。)
虽然您可以rand(42-10) + 10
用来获取介于10
和之间的随机数42
(其中10包括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.new
,则应尽可能少地调用它,例如一次调用它,MyApp::Random = Random.new
然后在其他任何地方使用它。
Random.new
以下是有帮助的情况:
rand
/ 序列Random.rand
Random
可以将对象编组很容易)backports
gem只是RUby 1.8.7、1.9.1、1.9.2的新方法集合,但是在Ruby中实现。我使用RubySpec来确保结果与Ruby兼容。
Random.rand(10..42)
不起作用。本Random.rand
类方法不接受范围。(Ruby 1.9.2p180)
如果您不仅要查找数字,还需要查找十六进制或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"
SecureRandom.random_number(1000..9999)
SecureRandom.random_number()
没有范围,所以不。您可能想要类似SecureRandom.random_number(10_000)
(对于0-9999)或SecureRandom.random_number(9_000)+1_000
(对于1000-9999)。
您可以使用该rand
方法生成一个随机数。传递给rand
方法的参数应为an integer
或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(1..6)
读物比头一个答案更清晰rand(6)+1
。
好吧,我知道了。显然有一个称为rand的内置(?)函数:
rand(n + 1)
如果有人回答的答案更详细,我会将其标记为正确答案。
最简单的答案:
rand(0..n)
此链接将对此有所帮助;
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)}
也许对您有帮助。我在我的应用程序中使用它
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
这对我来说可以
srand <some_number>
在编写rand
代码之前使用会给您确定的(即可重复的)伪随机序列。 ruby-doc.org/core-2.5.6/Random.html#method-c-srand