Ruby中生成隨機(jī)數(shù)的方法

這篇文章將為大家詳細(xì)講解有關(guān)Ruby中生成隨機(jī)數(shù)的方法,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、網(wǎng)站制作、呼瑪網(wǎng)絡(luò)推廣、微信平臺(tái)小程序開(kāi)發(fā)、呼瑪網(wǎng)絡(luò)營(yíng)銷、呼瑪企業(yè)策劃、呼瑪品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供呼瑪建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:muchs.cn

在Ruby中生成隨機(jī)數(shù)它可以在范圍程序(通常是游戲和模擬)中用于生成隨機(jī)數(shù)。雖然沒(méi)有計(jì)算機(jī)可以生成真正的隨機(jī)數(shù),但Ruby確實(shí)提供了對(duì)返回偽隨機(jī)數(shù)的方法的訪問(wèn)。

Ruby中生成隨機(jī)數(shù)的方法

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

沒(méi)有一臺(tái)計(jì)算機(jī)能純粹通過(guò)計(jì)算產(chǎn)生真正的隨機(jī)數(shù)。它們能做的最好的事情就是生成偽隨機(jī)數(shù),偽隨機(jī)數(shù)是一組看起來(lái)隨機(jī)但實(shí)際上不是隨機(jī)的數(shù)字。

對(duì)于人類觀察者來(lái)說(shuō),這些數(shù)字確實(shí)是隨機(jī)的。不會(huì)有短的重復(fù)序列,而且,至少對(duì)人類觀察者來(lái)說(shuō),它們是完全隨機(jī)的。但是,如果有足夠的時(shí)間和動(dòng)機(jī),就可以發(fā)現(xiàn)原始種子,重新創(chuàng)建序列,并猜測(cè)序列中的下一個(gè)數(shù)字。

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

如上所述,必須對(duì)偽隨機(jī)數(shù)生成器(PRNGs)進(jìn)行播種,以便每次生成新的隨機(jī)數(shù)時(shí)產(chǎn)生不同的序列。請(qǐng)記住,沒(méi)有一種方法是神奇的——這些看似隨機(jī)的數(shù)字是用相對(duì)簡(jiǎn)單的算法和相對(duì)簡(jiǎn)單的算術(shù)生成的。通過(guò)播種PRNG,每次都可以從不同的點(diǎn)開(kāi)始。如果你不播種,它每次都會(huì)產(chǎn)生相同的數(shù)字序列。

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

生成數(shù)字

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

# Generate an integer from 0 to 10
puts (rand() * 10).to_i

然而,如果您使用Ruby 1.9.x, Ruby會(huì)使事情變得更簡(jiǎn)單。Kernel#rand方法可以接受單個(gè)參數(shù)。如果這個(gè)參數(shù)是任何類型的數(shù)字,Ruby將生成一個(gè)從0到(不包括)那個(gè)數(shù)字的整數(shù)。

# Generate a number from 0 to 10
# In a more readable way
puts rand(10)

但是,如果您想要生成一個(gè)從10到15的數(shù)字呢?通常,您會(huì)生成一個(gè)從0到5的數(shù)字,并將其添加到10。然而,Ruby使它更容易。

您可以將一個(gè)Range對(duì)象傳遞給Kernel#rand,它的作用正如您所期望的:在該范圍內(nèi)生成一個(gè)隨機(jī)整數(shù)。

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

# Generate a number from 10 to 15
# Including 15
puts rand(10..15)

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

有時(shí)您需要一個(gè)看起來(lái)隨機(jī)的數(shù)字序列,但每次都需要生成相同的序列。例如,如果在單元測(cè)試中生成隨機(jī)數(shù),那么每次都應(yīng)該生成相同的數(shù)字序列。

在一個(gè)序列上失敗的單元測(cè)試在下一次運(yùn)行時(shí)應(yīng)該會(huì)再次失敗,如果下一次它生成了一個(gè)不同的序列,那么它可能不會(huì)失敗。為此,使用一個(gè)已知的常量值調(diào)用內(nèi)核#srand。

# Generate the same sequence of numbers every time
# the program is run
srand(5)
# Generate 10 random numbers
puts (0..10).map{rand(0..10)}

注意,內(nèi)核#rand的實(shí)現(xiàn)是非ruby的。它不以任何方式抽象PRNG,也不允許實(shí)例化PRNG。對(duì)于PRNG,所有代碼共享一個(gè)全局狀態(tài)。如果您更改種子或以其他方式更改PRNG的狀態(tài),其影響范圍可能比您預(yù)期的更廣。

然而,由于程序期望這個(gè)方法的結(jié)果是隨機(jī)的(因?yàn)檫@是它的目的),這可能永遠(yuǎn)不會(huì)成為問(wèn)題。只有當(dāng)程序期望看到一個(gè)預(yù)期的數(shù)字序列時(shí),例如它調(diào)用了一個(gè)具有常量值的srand,它才會(huì)看到意外的結(jié)果。

關(guān)于Ruby中生成隨機(jī)數(shù)的方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

網(wǎng)頁(yè)題目:Ruby中生成隨機(jī)數(shù)的方法
網(wǎng)站鏈接:http://muchs.cn/article2/gdohoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、App設(shè)計(jì)、動(dòng)態(tài)網(wǎng)站、微信公眾號(hào)、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)