把
創(chuàng)新互聯(lián)建站-成都網(wǎng)站建設(shè)公司,專注做網(wǎng)站、成都做網(wǎng)站、網(wǎng)站營(yíng)銷推廣,國(guó)際域名空間,網(wǎng)絡(luò)空間,網(wǎng)站托管、服務(wù)器租用有關(guān)企業(yè)網(wǎng)站制作方案、改版、費(fèi)用等問(wèn)題,請(qǐng)聯(lián)系創(chuàng)新互聯(lián)建站。
srand(
time(0)
);
放在循環(huán)外每次產(chǎn)生隨機(jī)數(shù)的種子也是一樣的啊,為什么產(chǎn)生的隨機(jī)數(shù)就不一樣了?
因?yàn)殡S機(jī)函數(shù)只需要一個(gè)種子就能產(chǎn)生一系列的隨機(jī)數(shù),并不是每個(gè)隨機(jī)數(shù)都需要一個(gè)種子。
你把
srand(time(0))
放到循環(huán)前面就可以了。
原因:
time(0)返回的是系統(tǒng)的時(shí)間(從1970.1.1午夜算起),單位:秒,而那個(gè)循環(huán)運(yùn)行起來(lái)耗時(shí)連0.000001秒都不到!
也就是說(shuō),srand(time(0))
連著4次的種子是一樣的,種子一樣,生產(chǎn)的隨機(jī)數(shù)當(dāng)然是一樣了。
如果你在把srand()放循環(huán)里面,在中間加個(gè)sleep函數(shù),消耗一點(diǎn)時(shí)間(間隔大于1秒),那么生成的rand
就不一樣了.但是這樣做很不好,連著兩次用srand生成的種子,間隔一樣,生產(chǎn)的隨機(jī)數(shù)間隔有會(huì)有規(guī)律性。
另:因?yàn)閮纱芜\(yùn)行同一程序的時(shí)間肯定是不一樣的,所以把srand放在循環(huán)前面可以得不同的種子,這樣才能得到你想要的。
c語(yǔ)言隨機(jī)數(shù)函數(shù)是 rand()
若要輸出1~10之間的隨機(jī)數(shù),
可用rand()%10+1。
srand()函數(shù)是初始化隨機(jī)數(shù)產(chǎn)生器,它產(chǎn)生隨機(jī)數(shù)種子,說(shuō)白了就是初始化隨機(jī)數(shù)。
srand((unsigned)time(0));取的是系統(tǒng)時(shí)間,也就是距離1970.1.1午夜有多少秒。而for循環(huán)每循環(huán)一次時(shí)間遠(yuǎn)遠(yuǎn)小于1秒,這就導(dǎo)致了srand((unsigned)time(0))產(chǎn)生的種子并沒有改變。 那么,相同的隨機(jī)數(shù)種子所產(chǎn)生的隨機(jī)數(shù)肯定是一樣的了。
擴(kuò)展資料:
C語(yǔ)言產(chǎn)生隨機(jī)數(shù)的方法:
1,在C語(yǔ)言中,rand()函數(shù)可以用來(lái)產(chǎn)生隨機(jī)數(shù),但是這不是真真意義上的隨機(jī)數(shù),是一個(gè)偽隨機(jī)數(shù),是根據(jù)一個(gè)數(shù),可以稱它為種子,為基準(zhǔn)以某個(gè)遞推公式推算出來(lái)的一系數(shù),當(dāng)這系列數(shù)很大的時(shí)候,就符合正態(tài)公布,從而相當(dāng)于產(chǎn)生了隨機(jī)數(shù)。
2,C語(yǔ)言中的隨機(jī)函數(shù)random,可是random函數(shù)并不是ANSI C標(biāo)準(zhǔn),所以說(shuō),random函數(shù)不能在gcc,vc等編譯器下編譯通過(guò)。
3,rand()會(huì)返回一隨機(jī)數(shù)值,范圍在0至RAND_MAX 間。返回0至RAND_MAX之間的隨機(jī)數(shù)值,RAND_MAX定義在stdlib.h,(其值至少為32767)我運(yùn)算的結(jié)果是一個(gè)不定的數(shù),要看你定義的變量類型,int整形的話就是32767。
4,在調(diào)用此函數(shù)產(chǎn)生隨機(jī)數(shù)前,必須先利用srand()設(shè)好隨機(jī)數(shù)種子,如果未設(shè)隨機(jī)數(shù)種子,rand()在調(diào)用時(shí)會(huì)自動(dòng)設(shè)隨機(jī)數(shù)種子為1。一般用for語(yǔ)句來(lái)設(shè)置種子的個(gè)數(shù)。
c語(yǔ)言中產(chǎn)生隨機(jī)數(shù)的相關(guān)函數(shù)主要包括srand和rand函數(shù),兩者配合生成隨機(jī)數(shù)據(jù),測(cè)試代碼如下,
#includestdio.h
#include stdlib.h
#include time.h
void main()
{
int i=0,j=0;
int p[5][5]={0};
srand(time(NULL));
for(i=0;i5;i++)
for(j=0;j5;j++)
p[i][j]=rand()%100+1;//產(chǎn)生1-100的隨機(jī)數(shù)存入數(shù)組p中
printf("二維數(shù)組p為:\n");
for(i=0;i5;i++)
{
for(j=0;j5;j++)
printf("%d\t",p[i][j]);
printf("\n");
}
}
一般srand和rand配合使用產(chǎn)生偽隨機(jī)數(shù)序列。rand函數(shù)在產(chǎn)生隨機(jī)數(shù)前,需要系統(tǒng)提供的生成偽隨機(jī)數(shù)序列的種子,rand根據(jù)這個(gè)種子的值產(chǎn)生一系列隨機(jī)數(shù)。如果系統(tǒng)提供的種子沒有變化,每次調(diào)用rand函數(shù)生成的偽隨機(jī)數(shù)序列都是一樣的。srand(unsigned seed)通過(guò)參數(shù)seed改變系統(tǒng)提供的種子值,從而可以使得每次調(diào)用rand函數(shù)生成的偽隨機(jī)數(shù)序列不同,從而實(shí)現(xiàn)真正意義上的“隨機(jī)”。通常可以利用系統(tǒng)時(shí)間來(lái)改變系統(tǒng)的種子值,即srand(time(NULL)),可以為rand函數(shù)提供不同的種子值,進(jìn)而產(chǎn)生不同的隨機(jī)數(shù)序列。
1. 基本函數(shù)
在C語(yǔ)言中取隨機(jī)數(shù)所需要的函數(shù)是:
int rand(void); void srand (unsigned int n);
rand()函數(shù)和srand()函數(shù)被聲明在頭文件stdlib.h中,所以要使用這兩個(gè)函數(shù)必須包含該頭文件:
#include stdlib.h
2. 使用方法
rand()函數(shù)返回0到RAND_MAX之間的偽隨機(jī)數(shù)(pseudorandom)。RAND_MAX常量被定義在stdlib.h頭文件中。其值等于32767,或者更大。
srand()函數(shù)使用自變量n作為種子,用來(lái)初始化隨機(jī)數(shù)產(chǎn)生器。只要把相同的種子傳入srand(),然后調(diào)用rand()時(shí),就會(huì)產(chǎn)生相同的隨機(jī)數(shù)序列。因此,我們可以把時(shí)間作為srand()函數(shù)的種子,就可以避免重復(fù)的發(fā)生。如果,調(diào)用rand()之前沒有先調(diào)用srand(),就和事先調(diào)用srand(1)所產(chǎn)生的結(jié)果一樣。
舉個(gè)例子,假設(shè)我們要取得0~10之間的隨機(jī)整數(shù)(不含10本身):
/* 例1:不指定種子的值 */
for (int i=0; i10; i++) { printf("%d ", rand()%10); }
每次運(yùn)行都將輸出:1 7 4 0 9 4 8 8 2 4
/* 例2:指定種子的值為1 */
srand(1); for (int i=0; i10; i++) { printf("%d ", rand()%10); }
每次運(yùn)行都將輸出:1 7 4 0 9 4 8 8 2 4
例2的輸出結(jié)果與例1是完全一樣的。
/* 例3:指定種子的值為8 */ srand(8); for (int i=0; i10; i++) { printf("%d ", rand()%10); }
每次運(yùn)行都將輸出:4 0 1 3 5 3 7 7 1 5
該程序取得的隨機(jī)值也是在[0,10)之間,與srand(1)所取得的值不同,但是每次運(yùn)行程序的結(jié)果都相同。
/* 例4:指定種子值為現(xiàn)在的時(shí)間 */ srand((unsigned)time(NULL)); for (int i=0; i10; i++) { printf("%d ", rand()%10); }
該程序每次運(yùn)行結(jié)果都不一樣,因?yàn)槊看螁?dòng)程序的時(shí)間都不同。另外需要注意的是,使用time()函數(shù)前必須包含頭文件time.h。
3. 注意事項(xiàng)
求一定范圍內(nèi)的隨機(jī)數(shù)。
如要取[0,10)之間的隨機(jī)整數(shù),需將rand()的返回值與10求模。
randnumber = rand() % 10;
那么,如果取的值不是從0開始呢?你只需要記住一個(gè)通用的公式。
要取[a,b)之間的隨機(jī)整數(shù)(包括a,但不包括b),使用:
(rand() % (b - a)) + a
偽隨機(jī)浮點(diǎn)數(shù)。
要取得0~1之間的浮點(diǎn)數(shù),可以用:
rand() / (double)(RAND_MAX)
如果想取更大范圍的隨機(jī)浮點(diǎn)數(shù),比如0~100,可以采用如下方法:
rand() /((double)(RAND_MAX)/100) 其他情況,以此類推,這里不作詳細(xì)說(shuō)明。
網(wǎng)站欄目:c語(yǔ)言隨機(jī)值的函數(shù),c語(yǔ)言中隨機(jī)數(shù)函數(shù)
文章網(wǎng)址:http://sd-ha.com/article0/hoosio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站導(dǎo)航、虛擬主機(jī)、外貿(mào)建站、網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)