詳談JS中實(shí)現(xiàn)種子隨機(jī)數(shù)及作用
來源:易賢網(wǎng) 閱讀:935 次 日期:2016-07-26 14:53:14
溫馨提示:易賢網(wǎng)小編為您整理了“詳談JS中實(shí)現(xiàn)種子隨機(jī)數(shù)及作用”,方便廣大網(wǎng)友查閱!

這篇文章詳細(xì)介紹了種子隨機(jī)數(shù)在JS中如何實(shí)現(xiàn)以及有什么作用,希望能幫助有需要的人。下面一起來看看。

前言

在前端開發(fā)中,尤其是游戲開發(fā),經(jīng)常會用到隨機(jī)數(shù),那么我們會第一時間想到:Math.random,大家略微的看看如下代碼:

for (var i= 0; i<10; i++) { document.writeln(Math.random() +"<br />"); }

運(yùn)行如上代碼,也確實(shí)生成了10個不同的數(shù)字,當(dāng)然你可以生成更多,看起來挺不錯的,如果僅僅如此,那么本文就沒必要寫了。

示例

試著想一下,如果在某一個場景,我們做一個游戲,用戶玩到一半的時候退出了,這樣用戶下次進(jìn)來可以選擇繼續(xù)上一次的進(jìn)度繼續(xù)玩,那么現(xiàn)在問題來了:用戶玩的進(jìn)度以及用戶的積分等簡單的描述數(shù)據(jù),我們都可以記錄下來,但是游戲里繪制的障礙物、飛行物以及很多裝飾類的小玩意兒,他們甚至是每次用戶點(diǎn)開始隨機(jī)輸出的,要把畫布上所有的東西以及它們的大小,位置等都記錄下來,實(shí)在是沒必要。

于是種子隨機(jī)數(shù)就閃亮登場了,我們?nèi)绻诋嫴忌显仉S機(jī)繪制的時候,有一個種子值,頁面上所有元素的位置、大小等都是根據(jù)這個種子來算的,那么等到第二次繪制的時候只需要傳入這個種子,就可以重現(xiàn)之前未完成的畫布元素。

那么這個時候,你會發(fā)現(xiàn)JS里面自帶的Math.random就不好使了,無法滿足需求,我們繼續(xù)看這段代碼:

代碼如下:

Math.seed = 5; Math.seededRandom = function(max, min) { max = max || 1; min = min || 0; Math.seed = (Math.seed * 9301 + 49297) % 233280; var rnd = Math.seed / 233280.0; return min + rnd * (max - min); }; for (var i= 0; i<10; i++) { document.writeln(Math.seededRandom() +"<br />"); }

運(yùn)行如上代碼你會發(fā)現(xiàn)如果種子Math.seed不變,那么生成的隨機(jī)數(shù)是不會變化的,哦了,如果引入這個函數(shù),那么重現(xiàn)游戲場景可以實(shí)現(xiàn)了,雖然還需要做更多的細(xì)節(jié)處理,但機(jī)制上是能保證的,本文的重點(diǎn)不是實(shí)現(xiàn)一個這樣的游戲。

本文的重點(diǎn)是:(Math.seed * 9301 + 49297) % 233280,為什么會是這三個值,而不是其它的到底這三個數(shù)字有什么神秘的來歷呢?

像Math.seededRandom這種偽隨機(jī)數(shù)生成器叫做線性同余生成器(LCG, Linear Congruential Generator),幾乎所有的運(yùn)行庫提供的rand都是采用的LCG,形如:

I n+1=aI n+c(mod m)

生成的偽隨機(jī)數(shù)序列最大周期m,范圍在0到m-1之間。要達(dá)到這個最大周期,必須滿足:

1.c與m互質(zhì)

2.a - 1可以被m的所有質(zhì)因數(shù)整除

3.如果m是4的倍數(shù),a - 1也必須是4的倍數(shù)

以上三條被稱為Hull-Dobell定理。作為一個偽隨機(jī)數(shù)生成器,周期不夠大是不好意思混的,所以這是要求之一。因此才有了:a=9301, c = 49297, m = 233280這組參數(shù),以上三條全部滿足。

以上就是關(guān)于種子隨機(jī)數(shù)在JS中如何實(shí)現(xiàn)和作用介紹的內(nèi)容,希望給JavaScript學(xué)習(xí)者有所幫助

更多信息請查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:詳談JS中實(shí)現(xiàn)種子隨機(jī)數(shù)及作用
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65317125(9:00—18:00) 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報警專用圖標(biāo)