網上常能見到的一段 JS 隨機數生成演算法如下,為什麼用 9301, 49297, 233280 這三個數字做基數?

時間 2021-05-10 18:49:20

1樓:franky

為啥不用random? 新瀏覽器可能會用音效卡噪音因素加入到隨機數生成的方法中去。

在瀏覽器裡玩的話,如果自己來搞,也許陀螺儀等裝置的一些資訊的加入。也可以增加隨機演算法的健壯性。如果再加入一些使用者態比如滑鼠座標滾動條位置啊等等都參與其中都可以把隨機性這件事做到更好會不會更有趣些?

2樓:monkey Tao

酷帖留名~,再修改一小下

varrand=(

function

()return

function

(number

)})()

3樓:貓南北

很多人認為這是簡單的Magic Number,其實這背後有內在的原因,這三個數字並不是隨便亂選出來的。

入門級的選擇標準

這種偽隨機數生成器叫做線性同餘生成器(LCG, Linear Congruential Generator),幾乎所有的執行庫提供的rand都是採用的LCG,形如:

生成的偽隨機數序列最大週期m,範圍在0到m-1之間。要達到這個最大週期,必須滿足

c與m互質

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

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

以上三條被稱為Hull-Dobell定理。

作為乙個偽隨機數生成器,週期不夠大是不好意思混的,所以這是要求之一。

可以看到,a=9301, c = 49297, m = 233280這組引數,以上三條全部滿足。

高階級的選擇標準

要在偽隨機數生成器界混,僅僅入門是不夠的。

從工程的角度來講,的值要(在合理的範圍內)足夠小,以避免溢位的問題。

從安全(實用)性的角度來講,還要滿足良好的隨機性,這一點可以通過Knuth's Spectral Test來評估(見[2][3]),要通過2,3,4,5以及6維的Spectral Test才行。Spectral Test考察的就是生成的偽隨機數序列在超空間的網格結構(lattice structure),當年IBM的RANDU子程式鬧出的烏龍,連3維的Spectral Test就不能通過,上圖嘲諷下:

其中每個點代表三個連續的RANDU生成的偽隨機數值,可以看到所有偽隨機數分布在了15個二維平面上。

在這種要求面前,c的值最好:

是質數 (c = 49297就是質數)

接近,(m = 233280時為49297.86460172205)

所以有了這樣一些基本的標準,能夠選擇的引數範圍就小了很多,弄個程式跑下Spectral Test,就能得到可選的引數組。

如果想要更加詳盡的了解LCG偽隨機數生成器的性質以及引數選取、測試的數學理論,可以嘗試閱讀《計算機程式設計藝術》卷2第3章。

參考資料:

為什麼龍珠很少能見到二打一的場景?

就業壓力大 佛利薩篇是出現最多二打一 如克林和悟飯打基紐分隊 克林悟飯貝吉塔一起剛佛利薩 劇場版可就多了去 波傑克成員群毆特蘭克斯悟飯四個超賽 那美克星人一起剛布羅利 眾人群毆希爾德剛 龍拳爆發那集 雷景影 原因很多,但我認為有乙個非常重要的原因就是懶 因為不好畫,鳥山明自己承認自己後期畫的時候已經...

為什麼人類的記憶總是一段一段的?

腦科學世界 試驗中,志願者一邊看電影 阿甘正傳 一邊接受fMRI掃瞄,同時另外一組志願者也看這部電影,並手動選出他們認為的電影事件起點與終點 one event ended and another began fMRI結果表明,hippocampus間隔性活躍,每次活躍點整與手動組選出的事件轉變點 ...

我找的留學中介寫的ps第一段能在網上找到原文,我該怎麼辦?

Andrew Li 不知道題主去什麼地方留學,PS並不一定就那麼重要。建議題主還是以結果為準,不要單單看PS本身。如果題主要換中介,給你提個建議,在找中介的時候要擦亮眼睛,別只聽對方說。下面的各位中介回答無非是說他們都會認真寫,不會那麼敷衍,不知道題主找到現在中介的時候,他是不是也是這麼回答的呢?看...