隨機數生成演算法

2021-05-23 21:35:11 字數 897 閱讀 3065

看到一些介紹隨機數生成演算法的文章,收集下來,有空深入了解下。

c語言中偽隨機數生成演算法實際上是採用了"線性同餘法」。具體的計算如下:

xi = (xi-1 * a + c ) mod m 

其中a,c,m都是常數(一般會取質數)。當c=0時,叫做乘同餘法。srand()函式置的seed實際上會作為x0被代入上式中,然後每次呼叫rand()函式都會用上一次產生的隨機值來生成新的隨機值。這樣我們可以看出實際上用rand()函式生成的是乙個遞推的序列,一切值都**於最初的seed。這就不難解釋為什麼當初始的seed取一樣的時候,得到的序列都相同。也就解釋了為什麼我們需要呼叫系統時間這種變化的值來充當seed了。

比較有意思的是在csdn上搜到了sjd163一篇文章講到了一種通過交換來得到隨機序列的方法。主要的依據是熱力學第二定律的熵增加原理。主要的思想是將有序的序列通過一定的交換將有序變成無序。思想類似於撲克牌的洗牌。假設撲克牌是從小到大的順序放好的,通過多次的洗牌之後撲克牌的順序性就逐漸消失,變的隨機。換句話說,系統的熵值變大。而且這種過程是不可逆的,只能從有序變成無序,不能從無序變成有序。

假設現在有乙個陣列,從小到大存放了一定數字。我們按照對插、倒排、交換、塊分割等等方法對這個陣列進行多輪的處理。原先包含在陣列中的順序關係就被我們逐漸打亂了。當然,為了使過程不可逆,我們可以在這些過程(比如交換)中引入簡單偽隨機值。通過n輪的處理之後,我們可以假設現在陣列已經變成了隨機序列。可以對結果進行概率分布的檢驗,如果檢驗不通過,重新進行處理,直到到達可以認為是隨機序列的程度。

另外一篇是來自開源中國的,乙個西安交大的學生,寫了乙個開源訊號處理庫(c++),實現了好幾種隨機演算法

隨機數生成演算法

這兩天沒事,就寫了寫數學課上老師說的那個 蒲豐投針實驗 的程式。接觸到了一些隨機數生成方面的東西,寫出來跟大家分享一下。對於計算機生成隨機數這個東西,以前有過一些淺顯的認識。只知道計算機不能生成真正的隨機數,只能用一定的方法來模擬隨機數,叫做偽隨機數。比如c語言裡面的rand 函式,就是乙個偽隨機數...

隨機數生成演算法的研究

摘 要 本文通過流程圖和實際例程,較詳細地闡述了隨機數生成的演算法和具體的程式設計,分析了其符合演算法特徵的特性。1引言 在 資料結構 演算法分析與設計 科學模擬等方面都需要用到隨機數。由於在數學上,整數是離散型的,實數是連續型的,而在某一具體的工程技術應用中,可能還有數 據值的範圍性和是否可重複性...

一種隨機數生成演算法

隨機數生成類 class randnumber randnumber randnumber unsigned long s 0 else unsigned short randnumber random unsigned long n double randnumber frandom unsign...