欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳談JS中實(shí)現(xiàn)種子隨機(jī)數(shù)及作用

 更新時(shí)間:2016年07月19日 10:58:55   投稿:daisy  
這篇文章詳細(xì)介紹了種子隨機(jī)數(shù)在JS中如何實(shí)現(xiàn)以及有什么作用,希望能幫助有需要的人。下面一起來(lái)看看。

前言

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

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

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

示例

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

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

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

復(fù)制代碼 代碼如下:

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

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

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

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

生成的偽隨機(jī)數(shù)序列最大周期m,范圍在0到m-1之間。要達(dá)到這個(gè)最大周期,必須滿(mǎn)足:
1.c與m互質(zhì)

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

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

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

總結(jié)

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

相關(guān)文章

  • JavaScript實(shí)現(xiàn)Java中StringBuffer的方法

    JavaScript實(shí)現(xiàn)Java中StringBuffer的方法

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)Java中StringBuffer的方法,實(shí)例分析了StringBuffer類(lèi)的實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下
    2015-02-02
  • js 彈出框 替代瀏覽器的彈出框

    js 彈出框 替代瀏覽器的彈出框

    js 彈出框 替代瀏覽器的彈出框,需要的朋友可以參考下。
    2010-10-10
  • javascript中內(nèi)置對(duì)象Math的介紹及用法案例

    javascript中內(nèi)置對(duì)象Math的介紹及用法案例

    Math對(duì)象是一個(gè)內(nèi)置對(duì)象,具有數(shù)學(xué)常數(shù)和函數(shù)的屬性和方法,不是一個(gè)函數(shù)對(duì)象,下面這篇文章主要給大家介紹了關(guān)于javascript中內(nèi)置對(duì)象Math的介紹及用法案例的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • 全面解析Bootstrap中nav、collapse的使用方法

    全面解析Bootstrap中nav、collapse的使用方法

    這篇文章主要為大家詳細(xì)解析了Bootstrap中nav、collapse的使用方法,感興趣的朋友可以參考一下
    2016-05-05
  • JointJS JavaScript流程圖繪制框架解析

    JointJS JavaScript流程圖繪制框架解析

    這篇文章主要介紹了JointJS JavaScript流程圖繪制框架解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • arrayToJson將數(shù)組轉(zhuǎn)化為json格式的js代碼

    arrayToJson將數(shù)組轉(zhuǎn)化為json格式的js代碼

    arrayToJson將數(shù)組轉(zhuǎn)化為json格式的js代碼,需要的朋友可以參考下。
    2010-10-10
  • uniapp使用navigateBack方法返回上級(jí)頁(yè)面并刷新的簡(jiǎn)單示例

    uniapp使用navigateBack方法返回上級(jí)頁(yè)面并刷新的簡(jiǎn)單示例

    最近寫(xiě)uniapp項(xiàng)目的時(shí)候發(fā)現(xiàn)有時(shí)候需要更新頁(yè)面數(shù)據(jù),所以下面這篇文章主要給大家介紹了關(guān)于uniapp使用navigateBack方法返回上級(jí)頁(yè)面并刷新的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • JavaScript canvas實(shí)現(xiàn)七彩太陽(yáng)光暈效果

    JavaScript canvas實(shí)現(xiàn)七彩太陽(yáng)光暈效果

    這篇文章主要為大家詳細(xì)介紹了JavaScript canvas實(shí)現(xiàn)七彩太陽(yáng)光暈效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 字符串反轉(zhuǎn)_JavaScript

    字符串反轉(zhuǎn)_JavaScript

    split()方法將一個(gè)字符串對(duì)象的每個(gè)字符拆出來(lái),并且將每個(gè)字符串當(dāng)成數(shù)組的每個(gè)元素 reverse()方法用來(lái)改變數(shù)組,將數(shù)組中的元素倒個(gè)序排列,第一個(gè)數(shù)組元素成為最后一個(gè),最后一個(gè)變成第一個(gè) join()方法將數(shù)組中的所有元素邊接成一個(gè)字符串
    2016-04-04
  • JS驗(yàn)證逗號(hào)隔開(kāi)可以是中文字母數(shù)字

    JS驗(yàn)證逗號(hào)隔開(kāi)可以是中文字母數(shù)字

    這篇文章主要介紹了JS驗(yàn)證逗號(hào)隔開(kāi)可以是中文字母數(shù)字 的相關(guān)資料,需要的朋友可以參考下
    2016-04-04

最新評(píng)論