如何在Ruby中生成隨機(jī)數(shù)

雖然沒(méi)有計(jì)算機(jī)可以生成真正的隨機(jī)數(shù),但Ruby確實(shí)可以訪問(wèn)一種返回偽隨機(jī)數(shù)的方法。

01

04 12

數(shù)字是't實(shí)際上是隨機(jī)的

沒(méi)有計(jì)算機(jī)可以純粹通過(guò)計(jì)算生成真正的隨機(jī)數(shù)。他們能做的最好的事情是生成偽隨機(jī)個(gè)數(shù)字,這些數(shù)字是出現(xiàn)隨機(jī)但不是的數(shù)字序列。

對(duì)于人類觀察者來(lái)說(shuō)健康安全知識(shí),這些數(shù)字確實(shí)是隨機(jī)的。將沒(méi)有短的重復(fù)序列,并且至少對(duì)于人類觀察者來(lái)說(shuō),它們沒(méi)有明確的模式。但是,給定足夠的時(shí)間和動(dòng)力,可以發(fā)現(xiàn)原始的種子,重新創(chuàng)建序列,并猜測(cè)序列中的下一個(gè)數(shù)字。

因此,本文中討論的方法可能不應(yīng)用于生成必須加密安全的數(shù)字。

偽隨機(jī)數(shù)生成器必須種子,以便生成每次生成新隨機(jī)數(shù)時(shí)都不同的序列。沒(méi)有任何方法是神奇的-這些看似隨機(jī)的數(shù)字是使用相對(duì)簡(jiǎn)單的算法和相對(duì)簡(jiǎn)單的算術(shù)生成的。通過(guò)播種PRNG,您'每次都在不同的點(diǎn)重新開(kāi)始。如果你沒(méi)有't種子,它每次都會(huì)產(chǎn)生相同的數(shù)字序列。

在Ruby中,可以在沒(méi)有參數(shù)的情況下調(diào)用Kernel#srand方法。它將根據(jù)時(shí)間,進(jìn)程ID和序列號(hào)選擇隨機(jī)數(shù)種子。只需在程序開(kāi)始時(shí)的任何地方調(diào)用srand,每次運(yùn)行它都會(huì)生成一系列不同的看似隨機(jī)的數(shù)字。當(dāng)程序啟動(dòng)時(shí),隱式調(diào)用此方法,并為PRNG播種時(shí)間和過(guò)程ID(無(wú)序列號(hào))。

02

of 04

基因組g Numbers

一旦程序運(yùn)行并且隱式或顯式調(diào)用Kernel#srand,就可以調(diào)用Kernel#rand方法。沒(méi)有參數(shù)調(diào)用的此方法將返回從0到1的隨機(jī)數(shù)。過(guò)去,這個(gè)數(shù)字通常被縮放到您希望生成的最大數(shù)字'd可能會(huì)到調(diào)用它以將其轉(zhuǎn)換為整數(shù)。

#生成從0到10的整數(shù)放置(rand()*10)。到

但是,如果您'重新使用Ruby 1.9.x,Kernel#rand方法可以采用單個(gè)參數(shù),Ruby會(huì)讓事情變得更容易一些。如果這個(gè)參數(shù)是任何類型的數(shù)字,Ruby將生成一個(gè)從0到(不包括)該數(shù)字的整數(shù)。

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

但是,如果要生成10到15的數(shù)字,該怎么辦?通常,您'd生成從0到5的數(shù)字并將其添加到10。但是,紅寶石使它更容易。

您可以將Range對(duì)象傳遞給Kernel#rand,它會(huì)像您'd expect:在該范圍內(nèi)生成一個(gè)隨機(jī)整數(shù)一樣。

確保注意兩種類型的范圍。如果您調(diào)用蘭德(10..15),則會(huì)生成10到15的數(shù)字,包括15。而蘭德(10…15)(有3個(gè)點(diǎn))將產(chǎn)生10到15的數(shù)字,不包括15。

#生成10到15的數(shù)字#包括15把蘭德(10..15)

03

119 of 04 120

非隨機(jī)數(shù)125 126

有時(shí)你需要一個(gè)隨機(jī)的數(shù)字序列,但每次都需要生成相同的序列。例如,如果在單元測(cè)試中生成隨機(jī)數(shù),則每次都應(yīng)生成相同的數(shù)字序列。

對(duì)一個(gè)序列失敗的單元測(cè)試應(yīng)該再次失敗xt time it's運(yùn)行,如果下次生成差異序列,它可能不會(huì)失敗。為此,調(diào)用具有已知和恒定值的Kernel#srand

每次生成相同的數(shù)字序列#該程序運(yùn)行srand(5)#生成10個(gè)隨機(jī)數(shù)放置(0..10).map{rand(0..10)}

04

of 04

有一個(gè)警告

Kernel#rand的實(shí)現(xiàn)相當(dāng)不紅寶石。它不以任何方式抽象PRNG,也不允許您實(shí)例化PRNG。PRNG有一個(gè)全球州,所有代碼共享。如果您更改種子或以其他方式更改PRNG的狀態(tài),它可能具有比您預(yù)期的更廣泛的效果。

但是,由于程序期望這種方法的結(jié)果是隨機(jī)的-即'它的目的!-這可能永遠(yuǎn)不會(huì)成為問(wèn)題。只有當(dāng)程序希望看到預(yù)期的數(shù)字序列時(shí)(例如,如果它以恒定值調(diào)用了srand),它才會(huì)看到意外的結(jié)果。

教育資源網(wǎng)_1