rand函數(shù)功能為獲取一個(gè)偽隨機(jī)數(shù)(偽隨機(jī)數(shù)的概念下面會(huì)有介紹)。
創(chuàng)新互聯(lián)公司從2013年開(kāi)始,先為前鋒等服務(wù)建站,前鋒等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為前鋒企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
一、函數(shù)名:
rand();
二、聲明:
int rand();
三、所在頭文件:
stdlib.h
四、功能:
返回一個(gè)偽隨機(jī)數(shù)。之所以說(shuō)是偽隨機(jī)數(shù),是因?yàn)樵跊](méi)有其它操作下,每次執(zhí)行同一個(gè)程序,調(diào)用rand得到的隨機(jī)數(shù)序列是固定的(不是真正的“隨機(jī)”)。
五、為了使rand的結(jié)果更“真”一些,也就是令其返回值更具有隨機(jī)性(不確定性),C語(yǔ)言在stdlib.h中還提供了srand函數(shù),通過(guò)該函數(shù)可以設(shè)置一個(gè)隨機(jī)數(shù)種子,一般用當(dāng)前時(shí)間的毫秒數(shù)來(lái)做參數(shù)。通過(guò)time(NULL)可以獲取到當(dāng)前時(shí)間的毫秒值(該函數(shù)位于time.h)中。
六、使用rand的流程可以總結(jié)為:
1 調(diào)用srand(time(NULL))設(shè)置隨機(jī)數(shù)種子。
2 調(diào)用rand函數(shù)獲取一個(gè)或一系列隨機(jī)數(shù)。
需要注意的是,srand只需要在所有rand調(diào)用前,被調(diào)用一次即可,沒(méi)必要調(diào)用多次。
七、以下是隨機(jī)獲取10個(gè)整型值并輸出的例子,輔助理解。
#include?stdio.h
#include?stdlib.h
#include?time.h
int?main()
{
int?i;
srand(time(NULL));//設(shè)置隨機(jī)數(shù)種子。
for(i?=?0;?i??10;?i?++)//運(yùn)行10次。
printf("%d\n",?rand());//每次獲取一個(gè)隨機(jī)數(shù)并輸出。
return?0;
}
c語(yǔ)言隨機(jī)數(shù)函數(shù)是 rand()
若要輸出1~10之間的隨機(jī)數(shù),
可用rand()%10+1。
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()之前沒(méi)有先調(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開(kāi)始呢?你只需要記住一個(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ō)明。
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)提供的種子沒(méi)有變化,每次調(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ù)序列。
隨機(jī)函數(shù)就是產(chǎn)生數(shù)的函數(shù),c語(yǔ)言里有rand(),srand()等函數(shù)。
用法
#include stdlib.h
#include stdio.h
#include time.h
void main( void )
{
int i,k;
srand( (unsigned)time( NULL ) ); //用系統(tǒng)時(shí)間當(dāng)種子,對(duì)隨機(jī)函數(shù)進(jìn)行初始化
for( i = 0; i 10;i++ )
{
k=rand()%100; //產(chǎn)生各個(gè)隨機(jī)數(shù)
printf( " k=%d/n", k );
}
}
詳述
rand() srand() 頭文件為#include stdlib.h
標(biāo)準(zhǔn)C庫(kù)中函數(shù)rand()可以生成0~RAND_MAX之間的一個(gè)隨機(jī)數(shù),其中RAND_MAX 是stdlib.h 中定義的一個(gè)整數(shù),它與系統(tǒng)有關(guān)。
rand()函數(shù)沒(méi)有輸入?yún)?shù),直接通過(guò)表達(dá)式rand()來(lái)引用,rand()%n是產(chǎn)生的隨機(jī)數(shù)對(duì)n取余,起到了取0到n-1之間隨機(jī)數(shù)的作用;
例如可以用下面的語(yǔ)句來(lái)打印兩個(gè)隨機(jī)數(shù): printf("Random numbers are: %i %i/n",rand(),rand());
因?yàn)閞and()函數(shù)是按指定的順序來(lái)產(chǎn)生整數(shù),而未指定運(yùn)行的種子,所以rand()每次使用的都是同一個(gè)種子來(lái)產(chǎn)生隨機(jī)數(shù)序列,因此每次執(zhí)行上面的語(yǔ)句都打印相同的兩個(gè)值,所以說(shuō)C語(yǔ)言的隨機(jī)并不是正真意義上的隨機(jī)。
為了時(shí)程序在每次執(zhí)行時(shí)都能生成一個(gè)新序列的隨機(jī)值,我們通常通過(guò)為隨機(jī)數(shù)生成器提供一粒新的隨機(jī)種子。函數(shù) srand()(來(lái)自stdlib.h)可以為隨機(jī)數(shù)生成器播散種子。只要種子不同rand()函數(shù)就會(huì)產(chǎn)生不同的隨機(jī)數(shù)序列。srand()稱為隨機(jī)數(shù)生成器的初始化器。
srand( (unsigned)time( NULL ) ); 用系統(tǒng)時(shí)間當(dāng)種子,對(duì)隨機(jī)函數(shù)進(jìn)行初始化,每次的系統(tǒng)時(shí)間不同,所以種子也就不同,產(chǎn)生的隨機(jī)數(shù)序列也就不同。