今天主要是來研究梅森旋轉演算法,它是用來產生偽隨機數的,實際上產生偽隨機數的方法有非常多種,比方線性同餘法,
平方取中法等等。可是這些方法產生的隨機數質量往往不是非常高,而今天介紹的梅森旋轉演算法能夠產生高質量的偽隨
機數,而且效率高效,彌補了傳統偽隨機數生成器的不足。梅森旋轉演算法的最長週期取自乙個梅森素數
此命名為梅森旋轉演算法。常見的兩種為基於32位的mt19937-32和基於64位的mt19937-64。
因為梅森旋轉演算法是利用線性反饋移位暫存器(lfsr)產生隨機數的,所以我們先來認識線性反饋移位暫存器。
首先,移位暫存器包含兩個部分
(1)級,每一級包括乙個位元,比方11010110是乙個8級的移位暫存器產生的
(2)反饋函式,線性反饋移位暫存器的反饋函式是線性的,非線性反饋移位暫存器的反饋函式是非線性的
乙個際上就是這個
饋函式之後,把這個移位暫存器的每次向右移動一位,把最右端的作為輸出,把「某些位」的異或結果作為輸入放到最
左端的那位,這樣全部的輸出相應乙個序列,這個序列叫做m序列,是最長線性移位暫存器序列的簡稱。
上面「某些位」的選取問題還沒有解決,那麼應該選取哪些位來進行異或才幹保證最長週期為
的問題。選取的「某些位」構成的序列叫做抽頭序列,理論表明,要使lfsr得到最長的週期,這個抽頭序列構成的多
項式加1必須是乙個本原多項式,也就是說這個多項式不可約,比方
以下以乙個4位的線性反饋移位暫存器為例說明它的工作原理。
假設1 0 0 0,反饋函式選取
能夠看出周長為15。在這乙個週期裡面涵蓋了開區間
的隨機性。
之前說過,梅森旋轉演算法的週期為19937級的線性反饋移位暫存器,實際上基於32位
的mt19937-32僅僅須要用到32位,那麼為什麼要選擇周長為
梅森旋轉演算法是基於線性反饋移位暫存器的一直進行移位旋轉,週期為乙個梅森素數
**:
#include #include #include #include using namespace std;
bool isinit;
int index;
int mt[624]; //624 * 32 - 31 = 19937
void srand(int seed)
}void generate()
}int rand()
int main()
cout<
實際上在非常多語言中的隨機數函式都已經採用了梅森旋轉法實現,比方python中的隨機數模組random就是採用了梅
森旋轉演算法來產生偽隨機數列,c++11中也有梅森旋轉演算法實現的隨機數生成器。
梅森旋轉演算法在資訊指紋技術中的應用
是把每個**隨機地對映到128位二進位制,這樣每個**僅僅占用16個位元組的空間,這個128位的隨機數就是這個
**的資訊指紋,能夠證明,僅僅要產生的隨機數足夠好,那麼就能夠保證差點兒不可能有兩個**的資訊指紋同樣,就
如同不可能有兩個人的指紋同樣一樣,而梅森旋轉演算法是產生高質量偽隨機數的演算法。
線性反饋移位暫存器(LFSR)實現
線性反饋移位暫存器 移位暫存器 組合邏輯反饋 用處 產生偽隨機序列 資料壓縮 計數器 資料編碼解碼等等 好處 具有速度和面積優勢 特點 產生偽隨機序列的最大長度 2 n 1 種類 one to many many to one 最大 的線性反饋移位暫存器 最大是指能產生的偽隨機序列長度最長 乙個d觸...
移位暫存器示例
這裡的移位暫存器不是簡單的向左移位將序列輸入轉換為並行輸出,而且要保留最後乙個週期的輸入數作為下一次輸出的最高位,如下所示 module shift reg clk,rst,din,dout ordy input clk input rst input 7 0 din output 31 0 dou...
左移暫存器vhdl 移位暫存器的VHDL設計
系部 計算機與資訊工程系 班級學號 姓名課程名稱 pld原理與應用 實驗日期 2012.10.31 實驗名稱 實驗三移位暫存器的 vhdl 設計成績 實驗目的 建立乙個移位模式可控的 位移位暫存器。練習建立工程 檔案 實體 結構體的建立,編譯 修改 實驗條件 裝有quartus 軟體的電腦 實驗內容...