当前位置:  开发笔记 > 后端 > 正文

如何在Ruby中获取随机数

如何解决《如何在Ruby中获取随机数》经验,为你挑选了11个好方法。

如何在0和之间生成随机数n



1> VonC..:

使用 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.


@VonC:很高兴你编辑了你提到新的`Random`类的答案,但是像你的例子那样多次调用`Random.new`是一个糟糕的主意.我编辑了我的答案,说明了这一点.
这不是非红宝石般的吗?我认为一切都是一个对象,最不惊讶的是......
@VonC啊:)对不起如果我有点苛刻,那只会让我感到惊讶

2> Marc-André L..:

虽然你可以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

在大多数情况下,最简单的是使用randRandom.rand.每次想要一个随机数时创建一个新的随机生成器是一个非常糟糕的主意.如果这样做,您将获得初始种子算法的随机属性,这些属性与随机生成器本身的属性相比是非常糟糕的.

如果你使用Random.new,你应该尽可能少地调用它,例如一次,MyApp::Random = Random.new并在其他地方使用它.

Random.new有用的案例如下:

你正在写一个宝石,不想用的序列干扰rand/ Random.rand主程序可能依靠

你想要单独的可重复的随机数序列(比如每个线程一个)

您希望能够保存和恢复可重现的随机数序列(很容易Random编组对象)


`Random.rand(10..42)`不起作用.`Random.rand`类方法不接受范围.(Ruby 1.9.2p180)

3> Thomas Fankh..:

如果您不仅要寻找一个数字而且还要求十六进制或uuid,那么值得一提的是该SecureRandom模块从ActiveSupport1.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)



4> 小智..:

您可以使用该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


它也可以是一个"Float".``兰德(1.1..2.7)``有效.

5> Mark A. Nico..:

好吧,我明白了.显然有一个名为rand的内置(?)函数:

rand(n + 1)

如果有人用更详细的答案回答,我会将其标记为正确答案.


是的,它内置在内核模块中.

6> Rimian..:

那这个呢?

n = 3
(0..n).to_a.sample


应该注意的是,生成像这种解决方案的数字数组在大范围内具有可怕的性能,因为它是O(n)而"rand"是O(1).

7> sqrcompass..:

最简单的答案:

rand(0..n)



8> techdreams..:

你可以简单地使用random_number.

如果给定正整数为n,则random_number返回一个整数:0 <= random_number

像这样使用它:

any_number = SecureRandom.random_number(100) 

输出将是0到100之间的任何数字.



9> Josh..:
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> 小智..:

范围= 10..50

兰特(范围)

要么

range.to_a.sample

要么

range.to_a.shuffle(这将对整个数组进行洗牌,您可以通过第一个或最后一个选择一个随机数,或者从该数组中随机选择一个随机数)



11> 小智..:

你可以做兰德(范围)

x = rand(1..5)

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有