国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

詳談JS中實現種子隨機數及作用

2019-11-20 09:27:04
字體:
來源:轉載
供稿:網友

前言

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

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

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

示例

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

于是種子隨機數就閃亮登場了,我們如果在畫布上元素隨機繪制的時候,有一個種子值,頁面上所有元素的位置、大小等都是根據這個種子來算的,那么等到第二次繪制的時候只需要傳入這個種子,就可以重現之前未完成的畫布元素。

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

復制代碼 代碼如下:

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 />"); }

運行如上代碼你會發現如果種子Math.seed不變,那么生成的隨機數是不會變化的,哦了,如果引入這個函數,那么重現游戲場景可以實現了,雖然還需要做更多的細節處理,但機制上是能保證的,本文的重點不是實現一個這樣的游戲。

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

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

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

生成的偽隨機數序列最大周期m,范圍在0到m-1之間。要達到這個最大周期,必須滿足:
1.c與m互質

2.a - 1可以被m的所有質因數整除

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

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

總結

以上就是關于種子隨機數在JS中如何實現和作用介紹的內容,希望給JavaScript學習者有所幫助

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宽城| 昭觉县| 夹江县| 蒲城县| 仲巴县| 临桂县| 浦县| 德江县| 苏尼特右旗| 宜城市| 兴义市| 贡嘎县| 文山县| 年辖:市辖区| 湘潭县| 神农架林区| 东乡县| 扎兰屯市| 平凉市| 水城县| 渝北区| 滨海县| 驻马店市| 津南区| 卢龙县| 大田县| 庆元县| 湛江市| 诸城市| 泰宁县| 岱山县| 邓州市| 和林格尔县| 通山县| 绩溪县| 乃东县| 英吉沙县| 安徽省| 句容市| 乌审旗| 桐城市|