


版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、VC獲取一定范圍內的隨機數一、C中不能使用random函數random函數不是 ANSI C標準不能在gccvc等編譯器下編 譯通過??筛挠?C下的rand函數來實現(xiàn)。1、C標準函數庫 提供一隨機數生成器 rand返回0-RAND_MAX 之間均勻分布 的偽隨機整數。RAND_MAX 必須至少為32767。rand函數 不接受參數默認以1為種子即起始值。隨機數生成器總是以 相同的種子開始所以形成的偽隨機數列也相同失去了隨機 意義。但這樣便于程序調試2、C中另一函數srand可以指定不同的數無符號整數變元為種子。但是如果種子相同偽隨 機數列也相同。一個辦法是讓用戶輸入種子但是仍然不理 想。3、比
2、較理想的是用變化的數比如時間來作為隨機數生 成器的種子。time的值每時每刻都不同。所以種子不同所以 產生的隨機數也不同。/C隨機函數 VC program includestdio.h include iostream include time.h using namespace std define MAX 100 int mainint argccharargv srandunsignedtimeNULL/srand函數產生一個以當前時間開 始的隨機種子.應該放在for等循環(huán)語句前面不然要很長時間 等待 forint i0i 10i cout randMAX endl/MAX為最大值其隨
3、機域為OMAX-1 return 0 二、rand的用法rand不需要參數它會 返回一個從0到最大隨機數的任意整數最大隨機數的大小通 常是固定的一個大整數。這樣如果你要產生010的10個整數可以表達為int Nrand11這樣N的值就是一個010的隨機數如果要產生 110 則是這樣 int N1rand11 總結來說可以表 示為 arandn 其中的 a 是起始值 n 是整數的范圍。 arandb-a1 就表示ab之間的一個隨機數若要01的小數則可以先取得010 的整數然后均除以 1 0即可得到隨機到十分位的10 個隨機小數若要得到隨機到百分位的隨機小數則需要先得到0100 的 10 個整數然
4、后均除以 100 其它情況依 此類推。 通 常 rand 產生的隨機數在每次運行的時候都是與上一次相同 的這是有意這樣設計的是為了便于程序的調試。若要產生每 次不同的隨機數可以使用srandseed函數進行隨機化隨著seed的不同就能夠產生不同的隨機數。如大家所說還可以包含 time.h 頭文件然后使用 srandtime0 來使用當前時間使隨 機數發(fā)生器隨機化這樣就可以保證每兩次運行時可以得到 不同的隨機數序列只要兩次運行的間隔超過 1 秒。 _ 要怎 么樣才能真正產生有效的隨機數 工作原理如下 1 首先給 srand提供一個種子它是一個unsigned int類型其取值范圍從065535
5、2然后調用rand它會根據提供給srand的種子值返回 一個隨機數在 0 到 32767 之間 3 根據需要多次調用 rand 從 而不間斷地得到新的隨機數 4 無論什么時候都可以給 srand 提供一個新的種子從而進一步隨機化 rand 的輸出結果。 因 為srand函數是一個隨機數產生函數其意思就是指C語言里的隨機數都是由它來控制產生的如果在應用srand函數之前就用隨機函數 rand 則相當于使用了 srand1 而將srandunsignedtimeNULL 這條語句放在了 for 循環(huán)里即是用了 srandunsignedtime0 故此句語句不變的話產生的隨機數就不 變 C 語言隨
6、機函數總結 rand 函數 原型 int randvoid 功能產 生從 0 到 RAND_MAX0x7fff 之間的隨機數。 頭文件 stdlib.h 例 include stdio.h include stdlib.h int main int k krand printfdnk return 0 2srand 函數 原型 void srandunsigned seed 功能產生 隨機數的起始發(fā)生數據和 rand 函數配合使用 頭文件 stdlib.h time.h 例 include stdio.h include stdlib.h include time.h void main ti
7、me_t t srandunsignedtimet printfdnrand0 這時運行程序 會發(fā)現(xiàn)每次產生的隨機數都不一樣。這是因為這里采用了時 間作為種子而時間在每時每刻都不相同所以就產生了隨機 的隨機數了。 所以要想產生不同的隨機數在使用 rand 之前需 要先調用 srand。 _ 偽隨機數生成及在 VC 中的實現(xiàn) 摘要偽 隨機數在計算機軟件設計中有很廣泛的用途。本文介紹了基 于數學方法的利用計算機產生偽隨機數的一種方法即線性 同余法任何偽隨機數的產生都是運用遞推的原理來生成的。以及在Visual C環(huán)境中產生偽隨機數的兩個重要函數rand和srand函數正確地使用這兩個函數是產生性能
8、良好的偽隨機 數的關鍵最后介紹了利用偽隨機數生成技術在 MFC 中生成 基于 C/S 模式應用程序的隨機校驗碼以及利用一種軟件工具 ImagePassword 產生隨機密碼。 關鍵詞偽隨機數生成線性同 余法 Visual C 隨機校驗碼 為追求真正的隨機序列人們曾采 用很多種原始的物理方法用于生成一定范圍內滿足精度位 數的均勻分布序列其缺點在于速度慢、效率低、需占用大量 存儲空間且不可重現(xiàn)等。為滿足計算機模擬研究的需求人們 轉而研究用算法生成模擬各種概率分布的偽隨機序列。偽隨 機數是指用數學遞推公式所產生的隨機數。從實用的角度看 獲取這種數的最簡單和最自然的方法是利用計算機語言的 函數庫提供的
9、隨機數發(fā)生器。典型情況下它會輸出一個均勻 分布在 0 和 1 區(qū)間內的偽隨機變量的值。其中應用的最為廣 泛、研究最徹底的一個算法即線性同余法。 線性同余法 LCGLinear Congruence Generator 選取足夠大的正整數 M 和 任意自然數nOab由遞推公式 nilafnibmod Mi01皿-1生成 的數值序列稱為是同余序列。 當函數 fn 為線性函數時即得到 線性同余序列 nilanibmod Mi01訓-1以下是線性同余法生 成偽隨機數的偽代碼 Randomnmseedab rOseed fori1ini riari-1bmod m 其中種子參數seed可以任意選擇常常將
10、它設 為計算機當前的日期或者時間 m 是一個較大數可以把它取 為2ww是計算機的字長 a可以是0.01w和0.99w之間的任何 整數。 應用遞推公式產生均勻分布隨機數時式中參數 nOabM 的選取十分重要。 例如選取 M1OabnO7 生成的隨機序 列為690769周期為4。取M16a5b3n07生成的隨機序列為 618111051215149032134761 周期為 16。取 M8a5b1n01 生 成的隨機序列為 6745230167周期為8。Visual C中偽隨機數生成機制 用 VC 產生隨機數有兩個函數分別為 randvoid 和 srandseed。 rand 產生的隨機整數是在
11、 0RAND_MAX 之間 平均分布的 RAND_MAX 是一個常量定義為 define RAND_MAX 0x7fff 。它是 short 型數據的最大值如果要產生 一個浮點型的隨機數可以將 rand/1000.0 這樣就得到一個 032.767 之間平均分布的隨機浮點數。如果要使得范圍大一 點那么可以通過產生幾個隨機數的線性組合來實現(xiàn)任意范 圍內的平均分布的隨機數。 其用法是先調用 srand 函數如 srandunsignedtimeNULL 這樣可以使得每次產生的隨機數序 列不同。如果計算偽隨機序列的初始數值稱為種子相同則計 算出來的偽隨機序列就是完全相同的。要解決這個問題需要 在每次
12、產生隨機序列前先指定不同的種子這樣計算出來的 隨機序列就不會完全相同了。 以 time 函數值即當前時間作為 種子數因為兩次調用 rand 函數的時間通常是不同的這樣就 可以保證隨機性了。也可以使用 srand 函數來人為指定種子 數。 分析以下兩個程序段 程序段 1 / 包含頭文件 void main int count0 forint i0i 10i srandunsignedtimeNULL count coutNoRAND 程序段 1 中由于將 srand 函數放在循環(huán)體內而 程序執(zhí)行的 CPU 時間較快調用 time 函數獲取的時間精度卻 較低 55ms 這樣循環(huán)體內每次產生隨機數用
13、到的種子數都是 一樣的因此產生的隨機數也是一樣的。而程序段2 中第 1 次 產生的隨機數要用到隨機種子以后的每次產生隨機數都是 利用遞推關系得到的。 基于 MFC 的隨機校驗碼生成 Web 應用程序中經常要利用到隨機校驗碼校驗碼的主要作用是 防止黑客利用工具軟件在線破譯用戶登錄密碼校驗碼、用戶 名、密碼三者配合組成了進入 Web 應用系統(tǒng)的鑰匙。 在利用 VC 開發(fā)的基于客戶機 / 瀏覽器 Client/Server 模式的應用軟件 系統(tǒng)中為了防止非法用戶入侵系統(tǒng)通常也要運用隨機校驗 碼生成技術。 本實現(xiàn)要用到以上介紹到的偽隨機數生成技 術。校驗碼數據將以 16 進制碼方式顯示。 主要代碼如下
14、 void CRandompasswordDlgOnCreatekey int RanCheckNum0 char out250 char keytemp50 memsetout0x3018 srandunsignedtimeGetTime/ 產生隨機數種子 forint i0i 6i RanCheckNumrand/ 產生隨機數 _itoaRanCheckNumkeytemp16/ 將隨機數轉換成 16 進制 memcpyouti4keytempstrlenkeytemp out240x00 strcpym_key.GetBuffer18out UpdateDataFALSE 運行結果如 圖 1 所示 圖 1 利用偽隨機數生成隨機校驗碼 程序運行時由 于每一次點擊產生隨機校驗碼的系統(tǒng)時間不同生成隨機數 的種子就不一樣因此產生的隨機數也是不一樣的從而保證 了校驗碼生成的隨機性。 利用 ImagePassword 工具產生隨機 密碼 ImagePassword 提供一個可選擇的圖形陣列通過隨機 改變圖形陣列中的陣點圖形來產生隨機密碼。當隨機點擊圖 象陣列中的圖象陣點該陣點中的圖象發(fā)生變化。其運行界面 如圖 2 所示 圖 2 ImagePassword 運行界面 點擊 OK 按鈕后 所產生的隨機密碼如圖 3 所示 圖 3 ImagePassword 運行結果 ImageP
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年農業(yè)機械化智能化在農業(yè)產業(yè)鏈中的協(xié)同創(chuàng)新研究報告
- 護理部物資采購管理制度
- 南昌工學院宿舍管理制度
- 景區(qū)保安責任管理制度
- 辦公室人員文件管理制度
- 女裝vip會員管理制度
- ktv治安規(guī)范管理制度
- 公司羽毛球場地管理制度
- 旅店消費安全管理制度
- 泵房施工消防管理制度
- 福建省廈門市2023-2024學年高一下學期期末質量檢測歷史試題(解析版)
- 四川省成都市西川中學2025年八年級英語第二學期期末檢測模擬試題含答案
- 工程項目經理競聘演講稿
- 天津水務集團有限公司招聘考試真題2024
- 《Linux系統(tǒng)安全》課件
- 辦公家具產品設計方案
- 第三屆全國技能大賽競賽(裝配鉗工)選拔賽備考試題(附答案)
- 過敏性休克的應急處理流程
- 大數據分析與機場運營效率提升-洞察闡釋
- GA 1812.3-2024銀行系統(tǒng)反恐怖防范要求第3部分:印鈔造幣企業(yè)
- 2025年度教師招聘考試教育綜合理論知識復習題庫及答案(共250題)
評論
0/150
提交評論