如何在Ruby中生成随机数

虽然没有计算机可以生成真正的随机数,但Ruby确实可以访问一种返回伪随机数的方法。

01

04 12

数字是't实际上是随机的

没有计算机可以纯粹通过计算生成真正的随机数。他们能做的比较好的事情是生成伪随机个数字,这些数字是出现随机但不是的数字序列。

对于人类观察者来说健康安全知识,这些数字确实是随机的。将没有短的重复序列,并且至少对于人类观察者来说,它们没有明确的模式。但是,给定足够的时间和动力,可以发现原始的种子,重新创建序列,并猜测序列中的下一个数字。

因此,本文中讨论的方法可能不应用于生成必须加密安全的数字。

伪随机数生成器必须种子,以便生成每次生成新随机数时都不同的序列。没有任何方法是神奇的-这些看似随机的数字是使用相对简单的算法和相对简单的算术生成的。通过播种PRNG,您'每次都在不同的点重新开始。如果你没有't种子,它每次都会产生相同的数字序列。

在Ruby中,可以在没有参数的情况下调用Kernel#srand方法。它将根据时间,进程ID和序列号选择随机数种子。只需在程序开始时的任何地方调用srand,每次运行它都会生成一系列不同的看似随机的数字。当程序启动时,隐式调用此方法,并为PRNG播种时间和过程ID(无序列号)。

02

of 04

基因组g Numbers

一旦程序运行并且隐式或显式调用Kernel#srand,就可以调用Kernel#rand方法。没有参数调用的此方法将返回从0到1的随机数。过去,这个数字通常被缩放到您希望生成的最大数字'd可能会到调用它以将其转换为整数。

#生成从0到10的整数放置(rand()*10)。到

但是,如果您'重新使用Ruby 1.9.x,Kernel#rand方法可以采用单个参数,Ruby会让事情变得更容易一些。如果这个参数是任何类型的数字,Ruby将生成一个从0到(不包括)该数字的整数。

##Generate a number from 0 to 10#以更可读的方式把兰德(10)

但是,如果要生成10到15的数字,该怎么办?通常,您'd生成从0到5的数字并将其添加到10。但是,红宝石使它更容易。

您可以将Range对象传递给Kernel#rand,它会像您'd expect:在该范围内生成一个随机整数一样。

确保注意两种类型的范围。如果您调用兰德(10..15),则会生成10到15的数字,包括15。而兰德(10…15)(有3个点)将产生10到15的数字,不包括15。

#生成10到15的数字#包括15把兰德(10..15)

03

119 of 04 120

非随机数125 126

有时你需要一个随机的数字序列,但每次都需要生成相同的序列。例如,如果在单元测试中生成随机数,则每次都应生成相同的数字序列。

对一个序列失败的单元测试应该再次失败xt time it's运行,如果下次生成差异序列,它可能不会失败。为此,调用具有已知和恒定值的Kernel#srand

每次生成相同的数字序列#该程序运行srand(5)#生成10个随机数放置(0..10).map{rand(0..10)}

04

of 04

有一个警告

Kernel#rand的实现相当不红宝石。它不以任何方式抽象PRNG,也不允许您实例化PRNG。PRNG有一个全球州,所有代码共享。如果您更改种子或以其他方式更改PRNG的状态,它可能具有比您预期的更广泛的效果。

但是,由于程序期望这种方法的结果是随机的-即'它的目的!-这可能永远不会成为问题。只有当程序希望看到预期的数字序列时(例如,如果它以恒定值调用了srand),它才会看到意外的结果。

教育资源网_1