


版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、VC獲取一定范圍內(nèi)的隨機(jī)數(shù)一、C中不能使用random函數(shù)random函數(shù)不是 ANSI C標(biāo)準(zhǔn)不能在gccvc等編譯器下編 譯通過(guò)??筛挠?C下的rand函數(shù)來(lái)實(shí)現(xiàn)。1、C標(biāo)準(zhǔn)函數(shù)庫(kù) 提供一隨機(jī)數(shù)生成器 rand返回0-RAND_MAX 之間均勻分布 的偽隨機(jī)整數(shù)。RAND_MAX 必須至少為32767。rand函數(shù) 不接受參數(shù)默認(rèn)以1為種子即起始值。隨機(jī)數(shù)生成器總是以 相同的種子開(kāi)始所以形成的偽隨機(jī)數(shù)列也相同失去了隨機(jī) 意義。但這樣便于程序調(diào)試2、C中另一函數(shù)srand可以指定不同的數(shù)無(wú)符號(hào)整數(shù)變?cè)獮榉N子。但是如果種子相同偽隨 機(jī)數(shù)列也相同。一個(gè)辦法是讓用戶輸入種子但是仍然不理 想。3、比
2、較理想的是用變化的數(shù)比如時(shí)間來(lái)作為隨機(jī)數(shù)生 成器的種子。time的值每時(shí)每刻都不同。所以種子不同所以 產(chǎn)生的隨機(jī)數(shù)也不同。/C隨機(jī)函數(shù) VC program includestdio.h include iostream include time.h using namespace std define MAX 100 int mainint argccharargv srandunsignedtimeNULL/srand函數(shù)產(chǎn)生一個(gè)以當(dāng)前時(shí)間開(kāi) 始的隨機(jī)種子.應(yīng)該放在for等循環(huán)語(yǔ)句前面不然要很長(zhǎng)時(shí)間 等待 forint i0i 10i cout randMAX endl/MAX為最大值其隨
3、機(jī)域?yàn)镺MAX-1 return 0 二、rand的用法rand不需要參數(shù)它會(huì) 返回一個(gè)從0到最大隨機(jī)數(shù)的任意整數(shù)最大隨機(jī)數(shù)的大小通 常是固定的一個(gè)大整數(shù)。這樣如果你要產(chǎn)生010的10個(gè)整數(shù)可以表達(dá)為int Nrand11這樣N的值就是一個(gè)010的隨機(jī)數(shù)如果要產(chǎn)生 110 則是這樣 int N1rand11 總結(jié)來(lái)說(shuō)可以表 示為 arandn 其中的 a 是起始值 n 是整數(shù)的范圍。 arandb-a1 就表示ab之間的一個(gè)隨機(jī)數(shù)若要01的小數(shù)則可以先取得010 的整數(shù)然后均除以 1 0即可得到隨機(jī)到十分位的10 個(gè)隨機(jī)小數(shù)若要得到隨機(jī)到百分位的隨機(jī)小數(shù)則需要先得到0100 的 10 個(gè)整數(shù)然
4、后均除以 100 其它情況依 此類推。 通 常 rand 產(chǎn)生的隨機(jī)數(shù)在每次運(yùn)行的時(shí)候都是與上一次相同 的這是有意這樣設(shè)計(jì)的是為了便于程序的調(diào)試。若要產(chǎn)生每 次不同的隨機(jī)數(shù)可以使用srandseed函數(shù)進(jìn)行隨機(jī)化隨著seed的不同就能夠產(chǎn)生不同的隨機(jī)數(shù)。如大家所說(shuō)還可以包含 time.h 頭文件然后使用 srandtime0 來(lái)使用當(dāng)前時(shí)間使隨 機(jī)數(shù)發(fā)生器隨機(jī)化這樣就可以保證每?jī)纱芜\(yùn)行時(shí)可以得到 不同的隨機(jī)數(shù)序列只要兩次運(yùn)行的間隔超過(guò) 1 秒。 _ 要怎 么樣才能真正產(chǎn)生有效的隨機(jī)數(shù) 工作原理如下 1 首先給 srand提供一個(gè)種子它是一個(gè)unsigned int類型其取值范圍從065535
5、2然后調(diào)用rand它會(huì)根據(jù)提供給srand的種子值返回 一個(gè)隨機(jī)數(shù)在 0 到 32767 之間 3 根據(jù)需要多次調(diào)用 rand 從 而不間斷地得到新的隨機(jī)數(shù) 4 無(wú)論什么時(shí)候都可以給 srand 提供一個(gè)新的種子從而進(jìn)一步隨機(jī)化 rand 的輸出結(jié)果。 因 為srand函數(shù)是一個(gè)隨機(jī)數(shù)產(chǎn)生函數(shù)其意思就是指C語(yǔ)言里的隨機(jī)數(shù)都是由它來(lái)控制產(chǎn)生的如果在應(yīng)用srand函數(shù)之前就用隨機(jī)函數(shù) rand 則相當(dāng)于使用了 srand1 而將srandunsignedtimeNULL 這條語(yǔ)句放在了 for 循環(huán)里即是用了 srandunsignedtime0 故此句語(yǔ)句不變的話產(chǎn)生的隨機(jī)數(shù)就不 變 C 語(yǔ)言隨
6、機(jī)函數(shù)總結(jié) rand 函數(shù) 原型 int randvoid 功能產(chǎn) 生從 0 到 RAND_MAX0x7fff 之間的隨機(jī)數(shù)。 頭文件 stdlib.h 例 include stdio.h include stdlib.h int main int k krand printfdnk return 0 2srand 函數(shù) 原型 void srandunsigned seed 功能產(chǎn)生 隨機(jī)數(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 這時(shí)運(yùn)行程序 會(huì)發(fā)現(xiàn)每次產(chǎn)生的隨機(jī)數(shù)都不一樣。這是因?yàn)檫@里采用了時(shí) 間作為種子而時(shí)間在每時(shí)每刻都不相同所以就產(chǎn)生了隨機(jī) 的隨機(jī)數(shù)了。 所以要想產(chǎn)生不同的隨機(jī)數(shù)在使用 rand 之前需 要先調(diào)用 srand。 _ 偽隨機(jī)數(shù)生成及在 VC 中的實(shí)現(xiàn) 摘要偽 隨機(jī)數(shù)在計(jì)算機(jī)軟件設(shè)計(jì)中有很廣泛的用途。本文介紹了基 于數(shù)學(xué)方法的利用計(jì)算機(jī)產(chǎn)生偽隨機(jī)數(shù)的一種方法即線性 同余法任何偽隨機(jī)數(shù)的產(chǎn)生都是運(yùn)用遞推的原理來(lái)生成的。以及在Visual C環(huán)境中產(chǎn)生偽隨機(jī)數(shù)的兩個(gè)重要函數(shù)rand和srand函數(shù)正確地使用這兩個(gè)函數(shù)是產(chǎn)生性能
8、良好的偽隨機(jī) 數(shù)的關(guān)鍵最后介紹了利用偽隨機(jī)數(shù)生成技術(shù)在 MFC 中生成 基于 C/S 模式應(yīng)用程序的隨機(jī)校驗(yàn)碼以及利用一種軟件工具 ImagePassword 產(chǎn)生隨機(jī)密碼。 關(guān)鍵詞偽隨機(jī)數(shù)生成線性同 余法 Visual C 隨機(jī)校驗(yàn)碼 為追求真正的隨機(jī)序列人們?cè)?用很多種原始的物理方法用于生成一定范圍內(nèi)滿足精度位 數(shù)的均勻分布序列其缺點(diǎn)在于速度慢、效率低、需占用大量 存儲(chǔ)空間且不可重現(xiàn)等。為滿足計(jì)算機(jī)模擬研究的需求人們 轉(zhuǎn)而研究用算法生成模擬各種概率分布的偽隨機(jī)序列。偽隨 機(jī)數(shù)是指用數(shù)學(xué)遞推公式所產(chǎn)生的隨機(jī)數(shù)。從實(shí)用的角度看 獲取這種數(shù)的最簡(jiǎn)單和最自然的方法是利用計(jì)算機(jī)語(yǔ)言的 函數(shù)庫(kù)提供的
9、隨機(jī)數(shù)發(fā)生器。典型情況下它會(huì)輸出一個(gè)均勻 分布在 0 和 1 區(qū)間內(nèi)的偽隨機(jī)變量的值。其中應(yīng)用的最為廣 泛、研究最徹底的一個(gè)算法即線性同余法。 線性同余法 LCGLinear Congruence Generator 選取足夠大的正整數(shù) M 和 任意自然數(shù)nOab由遞推公式 nilafnibmod Mi01皿-1生成 的數(shù)值序列稱為是同余序列。 當(dāng)函數(shù) fn 為線性函數(shù)時(shí)即得到 線性同余序列 nilanibmod Mi01訓(xùn)-1以下是線性同余法生 成偽隨機(jī)數(shù)的偽代碼 Randomnmseedab rOseed fori1ini riari-1bmod m 其中種子參數(shù)seed可以任意選擇常常將
10、它設(shè) 為計(jì)算機(jī)當(dāng)前的日期或者時(shí)間 m 是一個(gè)較大數(shù)可以把它取 為2ww是計(jì)算機(jī)的字長(zhǎng) a可以是0.01w和0.99w之間的任何 整數(shù)。 應(yīng)用遞推公式產(chǎn)生均勻分布隨機(jī)數(shù)時(shí)式中參數(shù) nOabM 的選取十分重要。 例如選取 M1OabnO7 生成的隨機(jī)序 列為690769周期為4。取M16a5b3n07生成的隨機(jī)序列為 618111051215149032134761 周期為 16。取 M8a5b1n01 生 成的隨機(jī)序列為 6745230167周期為8。Visual C中偽隨機(jī)數(shù)生成機(jī)制 用 VC 產(chǎn)生隨機(jī)數(shù)有兩個(gè)函數(shù)分別為 randvoid 和 srandseed。 rand 產(chǎn)生的隨機(jī)整數(shù)是在
11、 0RAND_MAX 之間 平均分布的 RAND_MAX 是一個(gè)常量定義為 define RAND_MAX 0x7fff 。它是 short 型數(shù)據(jù)的最大值如果要產(chǎn)生 一個(gè)浮點(diǎn)型的隨機(jī)數(shù)可以將 rand/1000.0 這樣就得到一個(gè) 032.767 之間平均分布的隨機(jī)浮點(diǎn)數(shù)。如果要使得范圍大一 點(diǎn)那么可以通過(guò)產(chǎn)生幾個(gè)隨機(jī)數(shù)的線性組合來(lái)實(shí)現(xiàn)任意范 圍內(nèi)的平均分布的隨機(jī)數(shù)。 其用法是先調(diào)用 srand 函數(shù)如 srandunsignedtimeNULL 這樣可以使得每次產(chǎn)生的隨機(jī)數(shù)序 列不同。如果計(jì)算偽隨機(jī)序列的初始數(shù)值稱為種子相同則計(jì) 算出來(lái)的偽隨機(jī)序列就是完全相同的。要解決這個(gè)問(wèn)題需要 在每次
12、產(chǎn)生隨機(jī)序列前先指定不同的種子這樣計(jì)算出來(lái)的 隨機(jī)序列就不會(huì)完全相同了。 以 time 函數(shù)值即當(dāng)前時(shí)間作為 種子數(shù)因?yàn)閮纱握{(diào)用 rand 函數(shù)的時(shí)間通常是不同的這樣就 可以保證隨機(jī)性了。也可以使用 srand 函數(shù)來(lái)人為指定種子 數(shù)。 分析以下兩個(gè)程序段 程序段 1 / 包含頭文件 void main int count0 forint i0i 10i srandunsignedtimeNULL count coutNoRAND 程序段 1 中由于將 srand 函數(shù)放在循環(huán)體內(nèi)而 程序執(zhí)行的 CPU 時(shí)間較快調(diào)用 time 函數(shù)獲取的時(shí)間精度卻 較低 55ms 這樣循環(huán)體內(nèi)每次產(chǎn)生隨機(jī)數(shù)用
13、到的種子數(shù)都是 一樣的因此產(chǎn)生的隨機(jī)數(shù)也是一樣的。而程序段2 中第 1 次 產(chǎn)生的隨機(jī)數(shù)要用到隨機(jī)種子以后的每次產(chǎn)生隨機(jī)數(shù)都是 利用遞推關(guān)系得到的。 基于 MFC 的隨機(jī)校驗(yàn)碼生成 Web 應(yīng)用程序中經(jīng)常要利用到隨機(jī)校驗(yàn)碼校驗(yàn)碼的主要作用是 防止黑客利用工具軟件在線破譯用戶登錄密碼校驗(yàn)碼、用戶 名、密碼三者配合組成了進(jìn)入 Web 應(yīng)用系統(tǒng)的鑰匙。 在利用 VC 開(kāi)發(fā)的基于客戶機(jī) / 瀏覽器 Client/Server 模式的應(yīng)用軟件 系統(tǒng)中為了防止非法用戶入侵系統(tǒng)通常也要運(yùn)用隨機(jī)校驗(yàn) 碼生成技術(shù)。 本實(shí)現(xiàn)要用到以上介紹到的偽隨機(jī)數(shù)生成技 術(shù)。校驗(yàn)碼數(shù)據(jù)將以 16 進(jìn)制碼方式顯示。 主要代碼如下
14、 void CRandompasswordDlgOnCreatekey int RanCheckNum0 char out250 char keytemp50 memsetout0x3018 srandunsignedtimeGetTime/ 產(chǎn)生隨機(jī)數(shù)種子 forint i0i 6i RanCheckNumrand/ 產(chǎn)生隨機(jī)數(shù) _itoaRanCheckNumkeytemp16/ 將隨機(jī)數(shù)轉(zhuǎn)換成 16 進(jìn)制 memcpyouti4keytempstrlenkeytemp out240x00 strcpym_key.GetBuffer18out UpdateDataFALSE 運(yùn)行結(jié)果如 圖 1 所示 圖 1 利用偽隨機(jī)數(shù)生成隨機(jī)校驗(yàn)碼 程序運(yùn)行時(shí)由 于每一次點(diǎn)擊產(chǎn)生隨機(jī)校驗(yàn)碼的系統(tǒng)時(shí)間不同生成隨機(jī)數(shù) 的種子就不一樣因此產(chǎn)生的隨機(jī)數(shù)也是不一樣的從而保證 了校驗(yàn)碼生成的隨機(jī)性。 利用 ImagePassword 工具產(chǎn)生隨機(jī) 密碼 ImagePassword 提供一個(gè)可選擇的圖形陣列通過(guò)隨機(jī) 改變圖形陣列中的陣點(diǎn)圖形來(lái)產(chǎn)生隨機(jī)密碼。當(dāng)隨機(jī)點(diǎn)擊圖 象陣列中的圖象陣點(diǎn)該陣點(diǎn)中的圖象發(fā)生變化。其運(yùn)行界面 如圖 2 所示 圖 2 ImagePassword 運(yùn)行界面 點(diǎn)擊 OK 按鈕后 所產(chǎn)生的隨機(jī)密碼如圖 3 所示 圖 3 ImagePassword 運(yùn)行結(jié)果 ImageP
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年文化旅游演藝項(xiàng)目策劃與運(yùn)營(yíng)模式文化體驗(yàn)設(shè)計(jì)創(chuàng)新報(bào)告
- 老年教育課程設(shè)置2025:生活化教學(xué)與個(gè)性化培養(yǎng)實(shí)踐報(bào)告
- 分布式能源系統(tǒng)2025年生物質(zhì)能源應(yīng)用能效提升與優(yōu)化分析報(bào)告
- 2025年醫(yī)養(yǎng)結(jié)合養(yǎng)老機(jī)構(gòu)養(yǎng)老地產(chǎn)開(kāi)發(fā)與運(yùn)營(yíng)策略報(bào)告
- 基于2025年視角的老舊街區(qū)改造社會(huì)穩(wěn)定風(fēng)險(xiǎn)評(píng)估體系構(gòu)建報(bào)告001
- 2025年二手奢侈品市場(chǎng)鑒定標(biāo)準(zhǔn)與交易規(guī)范行業(yè)市場(chǎng)細(xì)分領(lǐng)域消費(fèi)趨勢(shì)研究報(bào)告
- 2025年社區(qū)心理健康服務(wù)社區(qū)參與度提升策略報(bào)告
- 互聯(lián)網(wǎng)金融服務(wù)平臺(tái)在金融科技人才培養(yǎng)中的應(yīng)用研究
- 2025年醫(yī)藥企業(yè)研發(fā)外包(CRO)模式藥物研發(fā)疫苗研發(fā)與生產(chǎn)報(bào)告
- 2025年醫(yī)藥企業(yè)研發(fā)外包(CRO)模式的成本效益分析與優(yōu)化路徑報(bào)告
- 宣城市宣州區(qū)“政聘企培”人才引進(jìn)筆試真題2024
- 遠(yuǎn)程胎心監(jiān)護(hù)數(shù)據(jù)解讀
- 2025年 道路運(yùn)輸企業(yè)主要負(fù)責(zé)人考試模擬試卷(100題)附答案
- 2025至2030中國(guó)執(zhí)法系統(tǒng)行業(yè)經(jīng)營(yíng)效益及前景運(yùn)行態(tài)勢(shì)分析報(bào)告
- 2025年全國(guó)法醫(yī)專項(xiàng)技術(shù)考試試題及答案
- 供應(yīng)鏈公司展會(huì)策劃方案
- 南通市崇川區(qū)招聘 社區(qū)工作者筆試真題2024
- 2025年寧夏銀川市中考?xì)v史三模試卷(含答案)
- 【藝恩】出游趨勢(shì)洞察報(bào)告
- 口腔診所規(guī)章管理制度
- 商業(yè)地產(chǎn)項(xiàng)目成本控制與管理措施
評(píng)論
0/150
提交評(píng)論