在工程軟體的設計和安全系統設計中,建立模型、產生密碼經常需要使用到隨機數組。然而計算機不會產生絕對隨機的隨機數,計算機只能產生「偽隨機數」。其實絕對隨機的隨機數只是一種理想的隨機數,即使計算機怎樣發展,它也不會產生一串絕對隨機的隨機數。計算機只能生成相對的隨機數,即偽隨機數。
偽隨機數並不是假隨機數,而是指有規律的數,事實上都是由計算機經過一定的演算法計算得到的。大家常用的方法是根據乙個給定的數作為種子,如採用變化的時間作為種子,呼叫srand((unsigned)time(null))後執行rand()從而獲得乙個隨機數。很顯然,相同或相近的種子得到的隨機數將會是完全一樣或互相接近。
因此要產生真正意義的隨機數,那麼種子首先必須是隨機的。隨機的種子可以通過外接的硬體隨機發生器產生,據說最新的intel處理器即採用了讀取cpu上熱雜訊的方法來獲取隨機數。當無法利用硬體的隨機發生器時,我們常採用的辦法是,在兩次呼叫srand((unsigned)time(null))之間加入一定時間的延時。但當需要產生乙個很大的隨機數組時,這種延時是漫長而不可忍受的。而且事實上由於延時具有規律性,產生的隨機數也不那麼隨機。
一種容易想到的產生隨機數組的方法是設計出複雜的演算法,從而減小陣列結果的規律性。這種方法需要很高的技巧,也不太適合一般程式的呼叫。
此外,在很多情況下,我們不僅要求產生隨機的陣列,同時還對產生的陣列有統計規律上的要求。如必須服從正態分佈,均勻分布等。簡單的呼叫srand和rand函式無法滿足需要。
matlab是一種功能強大的工程數學軟體,利用其隨機數組產生模組,我們能很容易的得到服從各種分布形式的大陣列,其隨機數產生的原理即是基於複雜的演算法的。因此我們自然想到利用matlab產生的隨機數表來作為隨機數池,從中獲得我們所需要的隨機數組。
本隨機數組產生方法由三部分組成:其一是txt檔案的隨機數池,這裡我利用matlab產生1000個服從正態分佈的隨機數,10個一排,每兩個數字之間間隔3個空格,行首3個空格存為文字文件,第乙個數序號為0,然後按先行後列序號依次排列到999;其二和三分別是從隨機數池中撈取隨機數的函式類的.h檔案和.cpp檔案。
在撈取隨機函式的函式類中,定義cstdiofile的file1,開啟作為隨機數池的txt文件。首先以時間作為種子,產生乙個0-999的隨機數,讀取隨機數池中從以這個值為序號的開始的數,直到讀夠所需的隨機數組。序號如果超出數池的範圍則跳到數池的開始,繼續讀取。
呼叫本函式類,需要輸入int m_collect_times,double *a_random,int m_txt_line,int m_txt_row,int m_txt_spacing分別代表取點個數、取得的隨機數組的儲存位置、隨機數池行數、列數、數池中兩數間空格個數。並將"c:ygdebug amdom1000txt"改為你的隨機數池檔案的位置," "中的空格數改為你所使用的空格數。
下面為本函式類中的主要函式**:
void crandomarrayfromtxt::getrandomarrayfromtxt(int m_collect_times,
double *a_random,
int m_txt_line,
int m_txt_row,
int m_txt_spacing)
{int m,mx,my,cl;
srand((unsigned)time(null)); // 生成時間種子
m=rand()%m_txt_line; // 返回乙個0-m_txt_line-1的隨機數,即查表的起始位置
mx=m%m_txt_row; // 查表起始位置的列號,檔案頭為0行0列
my=m/m_txt_row; // 查表起始位置的行號
cl=(m_collect_times+mx-1)/m_txt_row+1; // 需要從數表中讀取的行數
// 開啟txt文字的數表。
cstdiofile file1( "c:ygdebug amdom1000.txt",
cfile::modenotruncate | cfile::moderead | cfile::typetext);
cstring strc;
int ct=0; // 用於記錄當前已經取得的隨機數個數
for(m=0;m本工程在vc++5.0、windowsxp環境中除錯通過。
本方法所產生的隨機數組實質上是數池中相連的一組數,對於某一陣列長度只能產生m_txt_line×m_txt_row個不同的隨機數組。因此越大的數池顯然效果越好。此外,我們可以採用另外一種更好的辦法撈取隨機數組。即首先用時間作為種子產生隨機數,從數池中撈取相應序號的數值,然後又用該數值作為種子生成隨機數,再從數池中撈取相應序號的數值。
如此迴圈下去,直至取夠需要的隨機數組。該方法的程式也很容易寫出,各位可以一試。
一種快速可預製的隨機數組產生方法
在工程軟體的設計和安全系統設計中,建立模型 產生密碼經常需要使用到隨機數組。然而計算機不會產生絕對隨機的隨機數,計算機只能產生 偽隨機數 其實絕對隨機的隨機數只是一種理想的隨機數,即使計算機怎樣發展,它也不會產生一串絕對隨機的隨機數。計算機只能生成相對的隨機數,即偽隨機數。偽隨機數並不是假隨機數,而...
軟體生成真隨機數組的一種方案
各種檔案都以位元組為單位,所以我們研究以位元組為單位的隨機數組即可,位元組的取值 0 255,它們是隨機數組的元素,建造乙個256個元素沒有重複元素的小陣列,稱之為單元陣列,這樣的單元有256!個大約有8.7 10的502次方之多。我們通過變換陣列成員的位置獲得新的單元,將生成的各單元連線起來組成大...
一種快速獲取N個不同隨機數的方法
因為專案需要,需要寫乙個演算法來獲取在f範圍內,獲取n個不同的值的演算法,因為random方法產生的值,是有可能存在相同的值,所以,選出來的值以後需要把相同的值去掉,因此根據這個思路,便有了以下的演算法 public static int randomint int n,int f if flag ...