VC獲取一定范圍內(nèi)的隨機數(shù)_第1頁
VC獲取一定范圍內(nèi)的隨機數(shù)_第2頁
VC獲取一定范圍內(nèi)的隨機數(shù)_第3頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、VC獲取一定范圍內(nèi)的隨機數(shù)一、C中不能使用random函數(shù)random函數(shù)不是 ANSI C標準不能在gccvc等編譯器下編 譯通過??筛挠?C下的rand函數(shù)來實現(xiàn)。1、C標準函數(shù)庫 提供一隨機數(shù)生成器 rand返回0-RAND_MAX 之間均勻分布 的偽隨機整數(shù)。RAND_MAX 必須至少為32767。rand函數(shù) 不接受參數(shù)默認以1為種子即起始值。隨機數(shù)生成器總是以 相同的種子開始所以形成的偽隨機數(shù)列也相同失去了隨機 意義。但這樣便于程序調(diào)試2、C中另一函數(shù)srand可以指定不同的數(shù)無符號整數(shù)變元為種子。但是如果種子相同偽隨 機數(shù)列也相同。一個辦法是讓用戶輸入種子但是仍然不理 想。3、比

2、較理想的是用變化的數(shù)比如時間來作為隨機數(shù)生 成器的種子。time的值每時每刻都不同。所以種子不同所以 產(chǎn)生的隨機數(shù)也不同。/C隨機函數(shù) VC program includestdio.h include iostream include time.h using namespace std define MAX 100 int mainint argccharargv srandunsignedtimeNULL/srand函數(shù)產(chǎn)生一個以當前時間開 始的隨機種子.應該放在for等循環(huán)語句前面不然要很長時間 等待 forint i0i 10i cout randMAX endl/MAX為最大值其隨

3、機域為OMAX-1 return 0 二、rand的用法rand不需要參數(shù)它會 返回一個從0到最大隨機數(shù)的任意整數(shù)最大隨機數(shù)的大小通 常是固定的一個大整數(shù)。這樣如果你要產(chǎn)生010的10個整數(shù)可以表達為int Nrand11這樣N的值就是一個010的隨機數(shù)如果要產(chǎn)生 110 則是這樣 int N1rand11 總結(jié)來說可以表 示為 arandn 其中的 a 是起始值 n 是整數(shù)的范圍。 arandb-a1 就表示ab之間的一個隨機數(shù)若要01的小數(shù)則可以先取得010 的整數(shù)然后均除以 1 0即可得到隨機到十分位的10 個隨機小數(shù)若要得到隨機到百分位的隨機小數(shù)則需要先得到0100 的 10 個整數(shù)然

4、后均除以 100 其它情況依 此類推。 通 常 rand 產(chǎn)生的隨機數(shù)在每次運行的時候都是與上一次相同 的這是有意這樣設(shè)計的是為了便于程序的調(diào)試。若要產(chǎn)生每 次不同的隨機數(shù)可以使用srandseed函數(shù)進行隨機化隨著seed的不同就能夠產(chǎn)生不同的隨機數(shù)。如大家所說還可以包含 time.h 頭文件然后使用 srandtime0 來使用當前時間使隨 機數(shù)發(fā)生器隨機化這樣就可以保證每兩次運行時可以得到 不同的隨機數(shù)序列只要兩次運行的間隔超過 1 秒。 _ 要怎 么樣才能真正產(chǎn)生有效的隨機數(shù) 工作原理如下 1 首先給 srand提供一個種子它是一個unsigned int類型其取值范圍從065535

5、2然后調(diào)用rand它會根據(jù)提供給srand的種子值返回 一個隨機數(shù)在 0 到 32767 之間 3 根據(jù)需要多次調(diào)用 rand 從 而不間斷地得到新的隨機數(shù) 4 無論什么時候都可以給 srand 提供一個新的種子從而進一步隨機化 rand 的輸出結(jié)果。 因 為srand函數(shù)是一個隨機數(shù)產(chǎn)生函數(shù)其意思就是指C語言里的隨機數(shù)都是由它來控制產(chǎn)生的如果在應用srand函數(shù)之前就用隨機函數(shù) rand 則相當于使用了 srand1 而將srandunsignedtimeNULL 這條語句放在了 for 循環(huán)里即是用了 srandunsignedtime0 故此句語句不變的話產(chǎn)生的隨機數(shù)就不 變 C 語言隨

6、機函數(shù)總結(jié) rand 函數(shù) 原型 int randvoid 功能產(chǎn) 生從 0 到 RAND_MAX0x7fff 之間的隨機數(shù)。 頭文件 stdlib.h 例 include stdio.h include stdlib.h int main int k krand printfdnk return 0 2srand 函數(shù) 原型 void srandunsigned seed 功能產(chǎn)生 隨機數(shù)的起始發(fā)生數(shù)據(jù)和 rand 函數(shù)配合使用 頭文件 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)每次產(chǎn)生的隨機數(shù)都不一樣。這是因為這里采用了時 間作為種子而時間在每時每刻都不相同所以就產(chǎn)生了隨機 的隨機數(shù)了。 所以要想產(chǎn)生不同的隨機數(shù)在使用 rand 之前需 要先調(diào)用 srand。 _ 偽隨機數(shù)生成及在 VC 中的實現(xiàn) 摘要偽 隨機數(shù)在計算機軟件設(shè)計中有很廣泛的用途。本文介紹了基 于數(shù)學方法的利用計算機產(chǎn)生偽隨機數(shù)的一種方法即線性 同余法任何偽隨機數(shù)的產(chǎn)生都是運用遞推的原理來生成的。以及在Visual C環(huán)境中產(chǎn)生偽隨機數(shù)的兩個重要函數(shù)rand和srand函數(shù)正確地使用這兩個函數(shù)是產(chǎn)生性能

8、良好的偽隨機 數(shù)的關(guān)鍵最后介紹了利用偽隨機數(shù)生成技術(shù)在 MFC 中生成 基于 C/S 模式應用程序的隨機校驗碼以及利用一種軟件工具 ImagePassword 產(chǎn)生隨機密碼。 關(guān)鍵詞偽隨機數(shù)生成線性同 余法 Visual C 隨機校驗碼 為追求真正的隨機序列人們曾采 用很多種原始的物理方法用于生成一定范圍內(nèi)滿足精度位 數(shù)的均勻分布序列其缺點在于速度慢、效率低、需占用大量 存儲空間且不可重現(xiàn)等。為滿足計算機模擬研究的需求人們 轉(zhuǎn)而研究用算法生成模擬各種概率分布的偽隨機序列。偽隨 機數(shù)是指用數(shù)學遞推公式所產(chǎn)生的隨機數(shù)。從實用的角度看 獲取這種數(shù)的最簡單和最自然的方法是利用計算機語言的 函數(shù)庫提供的

9、隨機數(shù)發(fā)生器。典型情況下它會輸出一個均勻 分布在 0 和 1 區(qū)間內(nèi)的偽隨機變量的值。其中應用的最為廣 泛、研究最徹底的一個算法即線性同余法。 線性同余法 LCGLinear Congruence Generator 選取足夠大的正整數(shù) M 和 任意自然數(shù)nOab由遞推公式 nilafnibmod Mi01皿-1生成 的數(shù)值序列稱為是同余序列。 當函數(shù) fn 為線性函數(shù)時即得到 線性同余序列 nilanibmod Mi01訓-1以下是線性同余法生 成偽隨機數(shù)的偽代碼 Randomnmseedab rOseed fori1ini riari-1bmod m 其中種子參數(shù)seed可以任意選擇常常將

10、它設(shè) 為計算機當前的日期或者時間 m 是一個較大數(shù)可以把它取 為2ww是計算機的字長 a可以是0.01w和0.99w之間的任何 整數(shù)。 應用遞推公式產(chǎn)生均勻分布隨機數(shù)時式中參數(shù) nOabM 的選取十分重要。 例如選取 M1OabnO7 生成的隨機序 列為690769周期為4。取M16a5b3n07生成的隨機序列為 618111051215149032134761 周期為 16。取 M8a5b1n01 生 成的隨機序列為 6745230167周期為8。Visual C中偽隨機數(shù)生成機制 用 VC 產(chǎn)生隨機數(shù)有兩個函數(shù)分別為 randvoid 和 srandseed。 rand 產(chǎn)生的隨機整數(shù)是在

11、 0RAND_MAX 之間 平均分布的 RAND_MAX 是一個常量定義為 define RAND_MAX 0x7fff 。它是 short 型數(shù)據(jù)的最大值如果要產(chǎn)生 一個浮點型的隨機數(shù)可以將 rand/1000.0 這樣就得到一個 032.767 之間平均分布的隨機浮點數(shù)。如果要使得范圍大一 點那么可以通過產(chǎn)生幾個隨機數(shù)的線性組合來實現(xiàn)任意范 圍內(nèi)的平均分布的隨機數(shù)。 其用法是先調(diào)用 srand 函數(shù)如 srandunsignedtimeNULL 這樣可以使得每次產(chǎn)生的隨機數(shù)序 列不同。如果計算偽隨機序列的初始數(shù)值稱為種子相同則計 算出來的偽隨機序列就是完全相同的。要解決這個問題需要 在每次

12、產(chǎn)生隨機序列前先指定不同的種子這樣計算出來的 隨機序列就不會完全相同了。 以 time 函數(shù)值即當前時間作為 種子數(shù)因為兩次調(diào)用 rand 函數(shù)的時間通常是不同的這樣就 可以保證隨機性了。也可以使用 srand 函數(shù)來人為指定種子 數(shù)。 分析以下兩個程序段 程序段 1 / 包含頭文件 void main int count0 forint i0i 10i srandunsignedtimeNULL count coutNoRAND 程序段 1 中由于將 srand 函數(shù)放在循環(huán)體內(nèi)而 程序執(zhí)行的 CPU 時間較快調(diào)用 time 函數(shù)獲取的時間精度卻 較低 55ms 這樣循環(huán)體內(nèi)每次產(chǎn)生隨機數(shù)用

13、到的種子數(shù)都是 一樣的因此產(chǎn)生的隨機數(shù)也是一樣的。而程序段2 中第 1 次 產(chǎn)生的隨機數(shù)要用到隨機種子以后的每次產(chǎn)生隨機數(shù)都是 利用遞推關(guān)系得到的。 基于 MFC 的隨機校驗碼生成 Web 應用程序中經(jīng)常要利用到隨機校驗碼校驗碼的主要作用是 防止黑客利用工具軟件在線破譯用戶登錄密碼校驗碼、用戶 名、密碼三者配合組成了進入 Web 應用系統(tǒng)的鑰匙。 在利用 VC 開發(fā)的基于客戶機 / 瀏覽器 Client/Server 模式的應用軟件 系統(tǒng)中為了防止非法用戶入侵系統(tǒng)通常也要運用隨機校驗 碼生成技術(shù)。 本實現(xiàn)要用到以上介紹到的偽隨機數(shù)生成技 術(shù)。校驗碼數(shù)據(jù)將以 16 進制碼方式顯示。 主要代碼如下

14、 void CRandompasswordDlgOnCreatekey int RanCheckNum0 char out250 char keytemp50 memsetout0x3018 srandunsignedtimeGetTime/ 產(chǎn)生隨機數(shù)種子 forint i0i 6i RanCheckNumrand/ 產(chǎn)生隨機數(shù) _itoaRanCheckNumkeytemp16/ 將隨機數(shù)轉(zhuǎn)換成 16 進制 memcpyouti4keytempstrlenkeytemp out240x00 strcpym_key.GetBuffer18out UpdateDataFALSE 運行結(jié)果如 圖 1 所示 圖 1 利用偽隨機數(shù)生成隨機校驗碼 程序運行時由 于每一次點擊產(chǎn)生隨機校驗碼的系統(tǒng)時間不同生成隨機數(shù) 的種子就不一樣因此產(chǎn)生的隨機數(shù)也是不一樣的從而保證 了校驗碼生成的隨機性。 利用 ImagePassword 工具產(chǎn)生隨機 密碼 ImagePassword 提供一個可選擇的圖形陣列通過隨機 改變圖形陣列中的陣點圖形來產(chǎn)生隨機密碼。當隨機點擊圖 象陣列中的圖象陣點該陣點中的圖象發(fā)生變化。其運行界面 如圖 2 所示 圖 2 ImagePassword 運行界面 點擊 OK 按鈕后 所產(chǎn)生的隨機密碼如圖 3 所示 圖 3 ImagePassword 運行結(jié)果 ImageP

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論