




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
-!基本函數在C語言中取隨機數所需要的函數是:intrand(void);voidsrand(unsignedintn);精品文檔放心下載rand()函數和srand()函數被聲明在頭文件stdlib.h中,所以要使用這兩個函數必須包含該頭文件:精品文檔放心下載#include<stdlib.h>使用方法rand()函數返回0到RAND_MAX之間的偽隨機數(pseudorandom)。RAND_MAX常量被定義在stdlib.h頭文件中。其值等于32767,或者更大。謝謝閱讀srand()函數使用自變量n作為種子,用來初始化隨機數產生器。只要把相同的種子傳入srand(),然后調用rand()時,就會產生相同的隨機數序列。因此,我們可以把時間作為srand()函數的種子,就可以避免重復的發生。如果,調用rand()之前沒有先調用srand(),就和事先調用srand(1)所產生的結果一樣。精品文檔放心下載/*例1:不指定種子的值*/for(inti=0;i<10;i++){printf("%d",rand()%10);}每次運行都將輸出:1740948824謝謝閱讀/*例2:指定種子的值為1*/srand(1);for(inti=0;i<10;i++){printf("%d",rand()%10);}每次運行都將輸出:1740948824感謝閱讀例2的輸出結果與例1是完全一樣的。-!/*例3:指定種子的值為8*/srand(8);for(inti=0;i<10;i++){printf("%d",rand()%10);}每次運行都將輸出:4013537715精品文檔放心下載該程序取得的隨機值也是在[0,10)之間,與srand(1)所取得的值不同,但是每次運行程序的結果都相精品文檔放心下載同。/*例4:指定種子值為現在的時間*/srand((unsigned)time(NULL));謝謝閱讀for(inti=0;i<10;i++){printf("%d",rand()%10);}該程序每次運行結果都不一樣,因為每次啟動程序的時間都不同。另外需要注意的是,使用time()函數前必須包含頭文件time.h。謝謝閱讀注意事項求一定范圍內的隨機數。如要取[0,10)之間的隨機整數,需將rand()的返回值與10求模。感謝閱讀randnumber=rand()%10;那么,如果取的值不是從0開始呢?你只需要記住一個通用的公式。感謝閱讀要取[a,b)之間的隨機整數(包括a,但不包括b),使用:謝謝閱讀(rand()%(b-a))+a偽隨機浮點數。要取得0~1之間的浮點數,可以用:rand()/(double)(RAND_MAX)謝謝閱讀如果想取更大范圍的隨機浮點數,比如0~100,可以采用如下方法:精品文檔放心下載-!rand()/((double)(RAND_MAX)/100)精品文檔放心下載其他情況,以此類推,這里不作詳細說明。當然,本文取偽隨機浮點數的方法只是用來說明函數的使用辦法,你可以采用更好的方法來實現。精品文檔放心下載舉個例子,假設我們要取得0~10之間的隨機整數(不含10本身):精品文檔放心下載大家可能很多次討論過隨機數在計算機中怎樣產生的問題,在這篇文章中,我會對這個問題進行更深入的探討,闡述我對這個問題的理解。感謝閱讀首先需要聲明的是,計算機不會產生絕對隨機的隨機數,計算機只能產生“偽隨機數”。其實絕對隨機的隨機數只是一種理想的隨機數,即使計算機怎樣發展,它也不會產生一串絕對隨機的隨機數。計算機只能生成相對的隨機數,即偽隨機數。謝謝閱讀偽隨機數并不是假隨機數,這里的“偽”是有規律的意思,就是計算機產生的偽隨機數既是隨機的又是有規律的。怎樣理解呢?產生的偽隨機數有時遵守一定的規律,有時不遵守任何規律;偽隨機數有一部分遵守一定的規律;另一部分不遵守任何規律。比如“世上沒有兩片形狀完全相同的樹葉”,這正是點到了事物的特性,即隨機性,但是每種樹的葉子都有近似的形狀,這正是事物的共性,即規律性。從這個角度講,你大概就會接受這樣的事實了:計算機只能產生偽隨機數而不能產生絕對隨機的隨機數。精品文檔放心下載那么計算機中隨機數是怎樣產生的呢?有人可能會說,隨機數是由“隨機種子”產生的。沒錯,隨機種子是用來產生隨機數的一個數,在計算機中,這樣的一個“隨機種子”是一個無符號整形數。那么隨機種子是從哪里獲得的呢?感謝閱讀下面看這樣一個C程序://rand01.c#include<dos.h>staticunsignedintRAND_SEED;謝謝閱讀unsignedintrandom(void){RAND_SEED=(RAND_SEED*123+59)%65536;精品文檔放心下載return(RAND_SEED);}voidrandom_start(void)-!{inttemp[2];movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);RAND_SEED=temp[0];謝謝閱讀}main(){unsignedinti,n;random_start();for(i=0;i<10;i++)printf("%u\t",random());printf("\n");}這個程序(rand01.c)完整地闡述了隨機數產生的過程:謝謝閱讀首先,主程序調用random_start()方法,random_start()方法中的這一句我很感興趣:感謝閱讀movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);精品文檔放心下載這個函數用來移動內存數據,其中FP_SEG(farpointertosegment)是取temp數組段地址的函精品文檔放心下載數,FP_OFF(farpointertooffset)是取temp數組相對地址的函數,movedata函數的作用是把位于0040:006CH存儲單元中的雙字放到數組temp的聲明的兩個存儲單元中。這樣可以通過temp數組感謝閱讀0040:006CH處的一個16位的數送給RAND_SEED。精品文檔放心下載random用來根據隨機種子RAND_SEED的值計算得出隨機數,其中這一句:感謝閱讀RAND_SEED=(RAND_SEED*123+59)%65536;精品文檔放心下載是用來計算隨機數的方法,隨機數的計算方法在不同的計算機中是不同的,即使在相同的計算機中安裝的不同的操作系統中也是不同的。我在linux和windows下分別試過,相同的隨機種子在這兩種操作系統中生成的隨機數是不同的,這說明它們的計算方法不同。感謝閱讀現在,我們明白隨機種子是從哪兒獲得的,而且知道隨機數是怎樣通過隨機種子計算出來的了。那么,隨機種子為什么要在內存的0040:006CH處取?0040:006CH處存放的是什么?謝謝閱讀學過《計算機組成原理與接口技術》這門課的人可能會記得在編制ROMBIOS時鐘中斷服務程序時會用到Intel8253定時/計數器,它與Intel8259中斷芯片的通信使得中斷服務程序得以運轉,主板每秒產生的18.2次中斷正是處理器根據定時/記數器值控制中斷芯片產生的。在我們計算機的主機板上都會有這樣一個定時/記數器用來計算當前系統時間,每過一個時鐘信號周期都會使記數器加一,而這個記數器的值存放在哪兒呢?沒錯,就在內存的0040:006CH處,其實這一段內存空間是這樣定義的:謝謝閱讀TIMER_LOWTIMER_HIGH
DW?DW?
;地址為;地址為
0040:006CH0040:006EHTIMER_OFT
DB?
;地址為
0040:0070H-!時鐘中斷服務程序中,每當TIMER_LOW轉滿時,此時,記數器也會轉滿,記數器的值歸零,即TIMER_LOW處的16位二進制歸零,而TIMER_HIGH加一。rand01.c中的謝謝閱讀movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);感謝閱讀正是把TIMER_LOW和TIMER_HIGH兩個16位二進制數放進temp數組,再送往RAND_SEED,謝謝閱讀從而獲得了“隨機種子”。現在,可以確定的一點是,隨機種子來自系統時鐘,確切地說,是來自計算機主板上的定時/計數器在內存中的記數值。這樣,我們總結一下前面的分析,并討論一下這些結論在程序中的應用:感謝閱讀1.隨機數是由隨機種子根據一定的計算方法計算出來的數值。所以,只要計算方法一定,隨機種子一精品文檔放心下載定,那么產生的隨機數就不會變。看下面這個C++程序://rand02.cpp#include<iostream>#include<ctime>usingnamespacestd;intmain(){unsignedintseed=5;srand(seed);unsignedintr=rand();cout<<r<<endl;}在相同的平臺環境下,編譯生成exe后,每次運行它,顯示的隨機數都是一樣的。這是因為在相同的感謝閱讀編譯平臺環境下,由隨機種子生成隨機數的計算方法都是一樣的,再加上隨機種子一樣,所以產生的隨機數就是一樣的。感謝閱讀2.只要用戶或第三方不設置隨機種子,那么在默認情況下隨機種子來自系統時鐘(即定時/計數器的精品文檔放心下載值)看下面這個C++程序://rand03.cpp#include<iostream>#include<ctime>usingnamespacestd;-!intmain(){srand((unsigned)time(NULL));精品文檔放心下載unsignedintr=rand();cout<<r<<endl;return0;}這里用戶和其他程序沒有設定隨機種子,則使用系統定時/計數器的值做為隨機種子,所以,在相同的感謝閱讀平臺環境下,編譯生成exe后,每次運行它,顯示的隨機數會是偽隨機數,即每次運行顯示的結果會有不同。謝謝閱讀3.建議:如果想在一個程序中生成隨機數序列,需要至多在生成隨機數之前設置一次隨機種子。感謝閱讀看下面這個用來生成一個隨機字符串的C++程序://rand04.cpp#include<iostream>#include<time.h>usingnamespacestd;intmain(){intrNum,m=20;char*ch=newchar[m];for(inti=0;i<m;i++)謝謝閱讀{//大家看到了,隨機種子會隨著for循環在程序中設置多感謝閱讀次srand((unsigned)time(NULL)*j);//j是后加的外層循環rNum=1+(int)((rand()/(double)RAND_MAX)*36);//精品文檔放心下載求隨機值-!switch(rNum){case1:ch[i]='a';break;case2:ch[i]='b';break;case3:ch[i]='c';break;case4:ch[i]='d';break;case5:ch[i]='e';break;case6:ch[i]='f';break;case7:ch[i]='g';break;case8:ch[i]='h';break;case9:ch[i]='i';break;case10:ch[i]='j';break;case11:ch[i]='k';break;case12:ch[i]='l';break;case13:ch[i]='m';break;-!case14:ch[i]='n';break;case15:ch[i]='o';break;case16:ch[i]='p';break;case17:ch[i]='q';break;case18:ch[i]='r';break;case19:ch[i]='s';break;case20:ch[i]='t';break;case21:ch[i]='u';break;case22:ch[i]='v';break;case23:ch[i]='w';break;case24:ch[i]='x';break;case25:ch[i]='y';break;case26:ch[i]='z';break;case27:ch[i]='0';break;case28:ch[i]='1';-!break;case29:ch[i]='2';break;case30:ch[i]='3';break;case31:ch[i]='4';break;case32:ch[i]='5';break;case33:ch[i]='6';break;case34:ch[i]='7';break;case35:ch[i]='8';break;case36:ch[i]='9';break;}//endofswitchcout<<ch[i];}//endofforloopcout<<endl;delete[]ch;return0;}而運行結果顯示的隨機字符串的每一個字符都是一樣的,也就是說生成的字符序列不隨機,所以我們需要把srand((unsigned)time(NULL));從for循環中移出放在for語句前面,這樣可以生成隨機的字符序列,而且每次運行生成的字符序列會不同(呵呵,也有可能相同,不過出現這種情況的幾率太小了)。感謝閱讀如
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 設計薪酬績效管理制度
- 評審項目分配管理制度
- 試行課堂手機管理制度
- 貝殼考試答案管理制度
- 財政分局對賬管理制度
- 貨品損失賠付管理制度
- 貨物監管倉庫管理制度
- 貨車司機黨員管理制度
- 2025年中國氡氣檢測試劑盒行業市場全景分析及前景機遇研判報告
- 塔吊安全服務協議書范本
- 部編版七年級歷史(下)材料論述題專項訓練
- 年產1000噸乳酸的生產工藝設計
- 博克服裝CAD制版說明操作手冊(共95頁)
- 南開中學小卷數學模擬試卷(共3頁)
- 光電效應測普朗克常數-實驗報告
- (完整word版)數據模型與決策課程案例分析
- 自制桁架移動式操作平臺施工方案
- 物業服務參與校園文化建設及舉辦大型活動配合措施
- 太陽能LED路燈項目實施方案
- 調崗調薪實操指引PPT課件
- 福清核電廠輻射防護生產準備實踐
評論
0/150
提交評論