C/C++中隨機(jī)函數(shù)rand/srand 的用法
一、C++中不能使用random()函數(shù)
???? random函數(shù)不是ANSI C標(biāo)準(zhǔn),不能在gcc,vc等編譯器下編譯通過(guò)。但在C語(yǔ)言中int random(num)可以這樣使用,它返回的是0至num-1的一個(gè)隨機(jī)數(shù)。 可改用C++下的rand函數(shù)來(lái)實(shí)現(xiàn)。
//在c中加上
???? 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ù)生成器總是以相同的種子開始,所以形成的偽隨機(jī)數(shù)列也相同,失去了隨機(jī)意義。(但這樣便于程序調(diào)試)?
????? 2、C++中另一函數(shù)srand(),可以指定不同的數(shù)(無(wú)符號(hào)整數(shù)變?cè)榉N子。但是如果種子相同,偽隨機(jī)數(shù)列也相同。一個(gè)辦法是讓用戶輸入種子,但是仍然不理想。?
???? 3、 比較理想的是用變化的數(shù),比如時(shí)間來(lái)作為隨機(jī)數(shù)生成器的種子。?time的值每時(shí)每刻都不同。所以種子不同,所以,產(chǎn)生的隨機(jī)數(shù)也不同。?
// C++隨機(jī)函數(shù)(VC program)?
#include
?????? srand( (unsigned)time( NULL ) );//srand()函數(shù)產(chǎn)生一個(gè)以當(dāng)前時(shí)間開始的隨機(jī)種子.應(yīng)該放在for等循環(huán)語(yǔ)句前面 不然要很長(zhǎng)時(shí)間等待
for (int i=0;i<10;i++)?
cout<<rand()%MAX<<endl;//MAX為最大值,其隨機(jī)域?yàn)?~MAX-1
?return 0;?
}?
二、rand()的用法?
???? rand()不需要參數(shù),它會(huì)返回一個(gè)從0到最大隨機(jī)數(shù)的任意整數(shù),最大隨機(jī)數(shù)的大小通常是固定的一個(gè)大整數(shù)。
/* ? maximum ? value ? returned ? by ? "rand" ? function ??
? */ ??
? #define ??RAND_MAX?? 0x7fffu ??
? ??
這個(gè)是bcc55中的定義,說(shuō)明這個(gè)整數(shù)的最大數(shù)是0x7fffu,u代表unicode編碼。
?
這樣,如果你要產(chǎn)生0~10的10個(gè)整數(shù),可以表達(dá)為:?
int N = rand() % 11;?
?????這樣,N的值就是一個(gè)0~10的隨機(jī)數(shù),如果要產(chǎn)生1~10,則是這樣:?
int N = 1 + rand() % 10;?
總結(jié)來(lái)說(shuō),可以表示為:?
a + rand() % n
?????其中的a是起始值,n是整數(shù)的范圍。
a + rand() % (b-a+1)?就表示?。帷庵g的一個(gè)隨機(jī)數(shù)
若要0~1的小數(shù),則可以先取得0~10的整數(shù),然后均除以10即可得到隨機(jī)到十分位的10個(gè)隨機(jī)小數(shù),若要得到隨機(jī)到百分位的隨機(jī)小數(shù),則需要先得到0~100的10個(gè)整數(shù),然后均除以100,其它情況依
此類推。?
?????通常rand()產(chǎn)生的隨機(jī)數(shù)在每次運(yùn)行的時(shí)候都是與上一次相同的,這是有意這樣設(shè)計(jì)的,是為了便于程序的調(diào)試。若要產(chǎn)生每次不同的隨機(jī)數(shù),可以使用srand( seed )函數(shù)進(jìn)行隨機(jī)化,隨著seed的不同,就能夠產(chǎn)生不同的隨機(jī)數(shù)。?
?????如大家所說(shuō),還可以包含time.h頭文件,然后使用srand(time(0))來(lái)使用當(dāng)前時(shí)間使隨機(jī)數(shù)發(fā)生器隨機(jī)化,這樣就可以保證每?jī)纱芜\(yùn)行時(shí)可以得到不同的隨機(jī)數(shù)序列(只要兩次運(yùn)行的間隔超過(guò)1秒)。