如何在0
和之间生成随机数n
?
使用 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)
(使用Random.new
)通常不是一个好主意,正如Marc-AndréLafortune(再次)在他的回答(再次)中详细解释的那样.
但是,如果你不使用Random.new
,那么类方法rand
只需要一个max
值,而不是一个Range
,因为栏杆的评论(大力)所指出的(并且记录在文档的Random
).只有实例方法可以采用a Range
,如生成7位数的随机数所示.
这就是为什么相当于Random.new.rand(20..30)
将是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
适用于所有版本的Ruby,需要我的backports
宝石.
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
编组对象)
如果您不仅要寻找一个数字而且还要求十六进制或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)
您可以使用该rand
方法生成随机数.传递给rand
方法的参数应该是a 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的内置(?)函数:
rand(n + 1)
如果有人用更详细的答案回答,我会将其标记为正确答案.
那这个呢?
n = 3 (0..n).to_a.sample
最简单的答案:
rand(0..n)
你可以简单地使用random_number
.
如果给定正整数为n,则 像这样使用它: 输出将是0到100之间的任何数字.random_number
返回一个整数:0 <= random_number
any_number = SecureRandom.random_number(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(这将对整个数组进行洗牌,您可以通过第一个或最后一个选择一个随机数,或者从该数组中随机选择一个随机数)
你可以做兰德(范围)
x = rand(1..5)