一種快速可預製的隨機陣列產生方法(轉)
一種快速可預製的隨機陣列產生方法(轉)[@more@] 在工程軟體的設計和安全系統設計中,建立模型、產生密碼經常需要使用到隨機陣列。然而計算機不會產生絕對隨機的隨機數,計算機只能產生“偽隨機數”。其實絕對隨機的隨機數只是一種理想的隨機數,即使計算機怎樣發展,它也不會產生一串絕對隨機的隨機數。計算機只能生成相對的隨機數,即偽隨機數。 偽隨機數並不是假隨機數,而是指有規律的數,事實上都是由計算機經過一定的演算法計算得到的。大家常用的方法是根據一個給定的數作為種子,如採用變化的時間作為種子,呼叫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 { file1.ReadString(strc); } // 取出有用的行,直到取夠為之 for(int n=0;n { if(n+my==m_Txt_Line) file1.SeekToBegin(); // 數表不夠長,重新定位到檔案頭 file1.ReadString(strc); if(n==0) // 如果是取得的第一行 { int aw1,aw2; aw1=strc.GetLength(); for(m=0;m { aw1=strc.GetLength(); aw2=strc.Find(" "); // 找到作為間隔的前三個空格所在位置 strc=strc.Right(aw1-aw2-m_Txt_Spacing); // 取這三個空格右邊的所有字串 } // 下面取出剩下的字串中每三個空格前面的字串,就是所要查一個資料 for(m=0;m { aw2=strc.Find(" ");// 找到作為間隔的後三個空格所在位置 if(mx==m_Txt_Row-1||m==m_Txt_Row-mx-1) a_Random[ct]=atof(strc); else a_Random[ct]=atof(strc.Left(aw2)); // 儲存資料到陣列 aw1=strc.GetLength(); aw2=strc.Find(" "); // 找到作為間隔的前三個空格所在位置 strc=strc.Right(aw1-aw2-m_Txt_Spacing); // 取這三個空格右邊的所有字串 ct++; } } else { GetRandomArrayFromALine(strc,a_Random, m_Collect_Times, m_Txt_Row, m_Txt_Spacing, ct); ct+=m_Txt_Row; } } file1.Close(); } /////////////////////// // 從一行中取出數字 /////////////////////// void CRandomArrayFromTxt::GetRandomArrayFromALine(CString strc, double *a_Random, int m_Collect_Times, int m_Txt_Row, int m_Txt_Spacing, int ct) { int aw1,aw2; aw1=strc.GetLength(); aw2=strc.Find(" "); strc=strc.Right(aw1-aw2-m_Txt_Spacing); // 取這三個空格右邊的所有字串 for(int m=0;m { aw2=strc.Find(" "); if(m==m_Txt_Row-1) a_Random[ct]=atof(strc); else a_Random[ct]=atof(strc.Left(aw2));// 儲存資料到陣列 aw1=strc.GetLength(); aw2=strc.Find(" ");// 找到作為間隔的前三個空格所在位置 strc=strc.Right(aw1-aw2-m_Txt_Spacing); // 取這三個空格右邊的所有字串 ct++; }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-951992/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE產生隨機數的多種方法分享 轉Oracle隨機
- JS陣列隨機排序的三種方法JS陣列隨機排序
- 產生唯一隨機碼的方法分析隨機
- matlab產生隨機數或隨機矩陣Matlab隨機矩陣
- GENERATING INTEGER RANDOM NUMBERS(幾種產生隨機數方法的效率分析) (轉)random隨機
- 計算機隨機數的產生 (轉)計算機隨機
- C 語言產生隨機數的方法隨機
- C語言產生隨機數的方法C語言隨機
- 玩轉陣列各種方法陣列
- Matlab產生特定範圍的隨機數矩陣Matlab隨機矩陣
- java語言複製陣列的四種方法Java陣列
- Redis快速產生測試資料的三種方法Redis
- 高效產生一組不重複的隨機數隨機
- R產生隨機數隨機
- 陣列快速生成range的方法陣列
- JavaScript陣列隨機排序JavaScript陣列隨機排序
- 用vb6製作隨機產生檔案把硬碟塞滿! (轉)隨機硬碟
- 隨機產生0-1之間實數的方法隨機
- 多維陣列轉一維陣列(降維的多種方式)陣列
- MVC把隨機產生的字串轉換為圖片MVC隨機字串
- vc中產生隨機數隨機
- c++產生隨機數C++隨機
- 關於如何產生隨機數的幾種方法彙總!(2018.07.08)隨機
- Python產生20個隨機整數的方法詳解!Python隨機
- C語言中產生真隨機數的方法,帶封裝C語言隨機封裝
- 高效產生不重複的隨機數隨機
- Linux 命令列生成隨機密碼的十種方法Linux命令列隨機密碼
- javascript 從一組陣列中隨機取出一項JavaScript陣列隨機
- [隨機數詳解]生成一個隨機數,生成指定範圍的隨機數及隨機陣列去重隨機陣列
- Oracle 產生序列的 6 種方法Oracle
- 陣列去重的六種方法陣列
- 遍歷陣列的幾種方法陣列
- 陣列去重的幾種方法陣列
- javascript中陣列的22種方法JavaScript陣列
- 【筆記】如何產生隨機數筆記隨機
- js隨機產生區間數JS隨機
- C#隨機產生漢字C#隨機
- 如何產生指定範圍的隨機數隨機