如何評價乙個偽隨機數生成演算法的優劣?

時間 2021-05-12 03:02:27

1樓:Sisi H

本來是來這裡看看能不能幫我完成作業的,看了看發現我老師說得還挺全的。

截老師的三張ppt

2樓:王建新

NIST SP800-22中規定了隨機數隨機性測試方法,共16個測試項,必選項15個,是國際上比較權威的測試方法,國密局的隨機數測試規範也參考了這個標準。按照此標準測試有開源的測試工具:sts(注意用最新版本)。

3樓:sunoru

發現沒有人提到 TestU01 (http://

simul.iro.umontreal.ca/

testu01/tu01.html

)TestU01是一套用於對隨機數生成器(RNG)進行經驗測試的工具,包括了各種文獻中提到的測試方法,以及一些實際問題中會遇到的情況測試。它的整套測試被稱作Big Crush,是目前最嚴格的隨機數測試套件,它可以很好地檢測乙個隨機數生成器的可靠程度(確實十分Big,在一台個人電腦上單核跑一次需要幾小時)。通常認為在通過Big Crush的前提下越快的演算法越值得使用。

事實上對現在廣為流行的各種看上去靠譜的隨機數生成器(包括好多人提到的MT19937之類的)進行Big Crush測試的時候都有不少問題,反而是一種十分「簡單」的演算法LCG(線性同餘生成器)表現相當良好。見下圖。(順便忍不住安利一下PCG family)

居然只有7種RNG通過了測試,然後下圖是這些RNG的速度測試(綠色的是通過測試的):

在這些常見的RNG中用於儲存隨機數狀態的空間使用也有所不同(越低越好):

乙個RNG的成效是跟它的狀態空間大小密切相關的,我們可以計算出使得每一種隨機數生成器能夠通過Big Crush的最小狀態數,實際使用的時候多出來的那些空間被定義叫做Headroom。同樣這裡有一張直觀的圖:

可以注意到不少人喜歡的XorShift演算法到96 bits的時候都沒能通過測試,而XorShift*演算法十分靠譜地在40 bits時即通過了所有測試。同時我們發現雖然前面的圖表中發現LCG的表現很好,但實際上它的Headroom並沒有很大(88 bits的狀態空間才通過Big Crush)。

PCG生成器只是對普通的LCG的一點點小改進,P表示的是Permuted,也就是對生成的隨機數進行了一些處理使得它更加」隨機「,如圖所示:

並且它的速度也十分可靠:

(以上資料和圖表均源自:http://www.

pcg-random.org/pdf/toms

-oneill-pcg-family-v1.02.pdf)

4樓:

5樓:白喵黑咪

由於隨機數是密碼學中最為重要的安全元件,你可以參考相應密碼學文獻來生成隨機數和偽隨機數。從理論上說,任何偽隨機數的生成方案破解等同於求解乙個數學難題,從然後實踐上講,首先應該通過李楠講到的nist測試包。已經記不太清楚,大致需要通過20種不同的攻擊測試。

如果你是想用而已,可以使用一些現成的加密演算法庫來用。如果是想自己弄,建議還是到此為止。各類無線通訊協議的安全漏洞首先都是從隨機數中冒出來的。

隨機數是密碼學的乙個大坑,都搞了幾十年了。不懂就別弄,後果很嚴重。

6樓:Xi Yang

題主你直接用MT19337吧。這個方法的隨機性和均勻性都非常好,只是不加密。你自己查一下Mersenne Twister,然後看看你要用的語言有沒有這個實現(有些語言會用這個作為預設的隨機數生成器)。

7樓:

請閱讀NIST SP800-22文件,共15個測試項。NIST還提供對應的測試套件。採集完隨機數,用渣電腦單執行緒測試的話,要好幾個小時。

8樓:

nist隨機性測試方法頻數測試:測試二進位制序列中,「0」和「1」 數目是否近似相等。如果是,則序列是隨機的。[1]

塊內頻數測試:目的是確定在待測序列中,所有非重疊的長度為M位的塊內的「0」和「1」的數目是否表現為隨機分布。如果是,則序列是隨機的。

遊程測試:目的是確定待測序列中,各種特定長度的 「0」和「1」的遊程數目是否如真隨機序列期望的那樣。如果是,則序列是隨機的。

塊內最長連續「1」測試:目的是確定待測序列中, 最長連「1」串的長度是否與真隨機序列中最長連「1」串的長度近似一致。如果是,則序列是隨機的。

離散傅利葉變換測試:目的是通過檢測待測序列的週期性質,並與真隨機序列週期性質相比較,通過它們之間的偏離程度來確定待測序列隨機性。如果偏離程度較小,序列是隨機的。

非重疊模板匹配測試:目的是檢測待測序列中,子串行是否與太多的非週期模板相匹配。太多就意味著待測序列是非隨機的。

重疊模板匹配測試:目的是統計待測序列中,特定長度的連續「1」的數目,是否與真隨機序列的情況偏離太大。太大是非隨機的。

通用統計測試:目的是檢測待測序列是否能在資訊不丟失的情況下被明顯壓縮。乙個不可被明顯壓縮的序列是隨機的。

壓縮測試:目的是確定待測序列能被壓縮的程度,如果能被顯著壓縮,說明不是隨機序列。

線性複雜度測試:目的是確定待測序列是否足夠複雜,如果是,則序列是隨機的。

連續性測試:目的是確定待測序列所有可能的m位位元的組合子串出現的次數是否與真隨機序列中的情況近似相同,如果是,則序列是隨機的。

近似熵測試:目的是通過比較m位位元串與m-1位位元串在待測序列中出現的頻度,再與正態分佈的序列中的情況相對比,從而確定隨機性。

部分和測試:目的確定待測序列中的部分和是否太大或太小。太大或太小都是非隨機的。

隨機遊走測試:目的是確定在乙個隨機遊程中,某個特定狀態出現的次數是否遠遠超過真隨機序列中的情況。如果是,則序列是非隨機的。

隨機遊走變數測試:目的是檢測待測序列中,某一特定狀態在乙個遊機遊程中出現次數與真隨機序列的偏離程度。如果偏離程度較大,則序列是非隨機的。

參考 http://

zh.wikipedia.org/wiki/%

E9%9A%8F%E6%9C%BA%E6%80%A7

測試程式前面有人給過了,這裡重複一下位址 NIST.gov - Computer Security Division

類似的測試標準和程式還有diehard The Marsaglia Random Number CDROM including the Diehard Battery

of Tests

GNU Crypto - GNU Project 這個專案裡面有開源的ENT測試。主要測試有五項。詳細資訊見鏈結 Ent (GNU cryptographic primitives and tools, version 2.

0.0)

9樓:DannyLi

有一系列的測試可以判斷乙個隨機數生成器的優劣。NIST發布了乙個工具包專門用來做這件事情。

網頁為英文,而且我不知道是否需要翻牆。

10樓:楊勤榮

據我所知,卡方檢測是乙個比較有效的方法;還有乙個方法就是以該隨機數發生器為基礎,用蒙特卡洛方法求高維數值積分(例如n維球的體積和面積),如果隨機數生成器足夠好,積分結果應該能很好地逼近理論值。

11樓:余天公升

乙個比較簡單的方法,用隨機數填充乙個位圖,下面是乙個填充黑白影象的例子。

這個是用C#的System.Random類生成的隨機數填充的點陣圖這個是用php的rand函式生成的隨機數填充的點陣圖哪個比較差一目了然。

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

franky 為啥不用random?新瀏覽器可能會用音效卡噪音因素加入到隨機數生成的方法中去。在瀏覽器裡玩的話,如果自己來搞,也許陀螺儀等裝置的一些資訊的加入。也可以增加隨機演算法的健壯性。如果再加入一些使用者態比如滑鼠座標滾動條位置啊等等都參與其中都可以把隨機性這件事做到更好會不會更有趣些? mo...

泊松隨機數的生成演算法 數學推導和程式實現

書衣活 很巧,這兩天分別盡了適馬30 1.4 40 1.4兩支鏡頭,分別搭配尼康D3100和D5600。跑焦,都跑,用調焦底座,拍攝對焦卡,基本上沒問題後,再實拍人,繼續微調。調準後合焦概率挺大的。D5600配適馬40 1.4今天晚上終於調整成功了,鏡頭分別做了 1 3 7 4的調整。室內拍人無壓力...

生成乙個真隨機數,假如使時空逆轉,再重新生成,這個隨機數會發生變化嗎?

Akriver 我認為,該隨機數是否改變,取決於是否會改變歷史。目前認為,只有量子裝置才能產生真隨機數,普通計算機只能產生偽隨機數。而真隨機數在時空回溯時是否會變化,不能單一只考慮隨機本身,還要考慮時空邏輯和蝴蝶效應,時空收束的綜合作用。以下考慮單一世界線,非平行宇宙的世界 假定我們有乙個彩票機,該...