rand函數(shù)功能為獲取一個(gè)偽隨機(jī)數(shù)(偽隨機(jī)數(shù)的概念下面會(huì)有介紹)。
員工經(jīng)過長期磨合與沉淀,具備了協(xié)作精神,得以通過團(tuán)隊(duì)的力量開發(fā)出優(yōu)質(zhì)的產(chǎn)品。創(chuàng)新互聯(lián)堅(jiān)持“專注、創(chuàng)新、易用”的產(chǎn)品理念,因?yàn)椤皩W⑺詫I(yè)、創(chuàng)新互聯(lián)網(wǎng)站所以易用所以簡單”。公司專注于為企業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、電商網(wǎng)站開發(fā),成都微信小程序,軟件按需定制開發(fā)等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。
一、函數(shù)名:
rand();
二、聲明:
int rand();
三、所在頭文件:
stdlib.h
四、功能:
返回一個(gè)偽隨機(jī)數(shù)。之所以說是偽隨機(jī)數(shù),是因?yàn)樵跊]有其它操作下,每次執(zhí)行同一個(gè)程序,調(diào)用rand得到的隨機(jī)數(shù)序列是固定的(不是真正的“隨機(jī)”)。
五、為了使rand的結(jié)果更“真”一些,也就是令其返回值更具有隨機(jī)性(不確定性),C語言在stdlib.h中還提供了srand函數(shù),通過該函數(shù)可以設(shè)置一個(gè)隨機(jī)數(shù)種子,一般用當(dāng)前時(shí)間的毫秒數(shù)來做參數(shù)。通過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)用一次即可,沒必要調(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;
}
rand()
rand()函數(shù)用來產(chǎn)生隨機(jī)數(shù),但是,rand()的內(nèi)部實(shí)現(xiàn)是用線性同余法實(shí)現(xiàn)的,是偽隨機(jī)數(shù),由于周期較長,因此在一定范圍內(nèi)可以看成是隨機(jī)的。
rand()會(huì)返回一個(gè)范圍在0到RAND_MAX(至少是32767)之間的偽隨機(jī)數(shù)(整數(shù))。
在調(diào)用rand()函數(shù)之前,可以使用srand()函數(shù)設(shè)置隨機(jī)數(shù)種子,如果沒有設(shè)置隨機(jī)數(shù)種子,rand()函數(shù)在調(diào)用時(shí),自動(dòng)設(shè)計(jì)隨機(jī)數(shù)種子為1。隨機(jī)種子相同,每次產(chǎn)生的隨機(jī)數(shù)也會(huì)相同。
rand()函數(shù)需要的頭文件是:stdlib.h
rand()函數(shù)原型:int rand(void);
使用rand()函數(shù)產(chǎn)生1-100以內(nèi)的隨機(jī)整數(shù):int number1 = rand() % 100+1。
srand()
srand()函數(shù)需要的頭文件仍然是:stdlib.h
srand()函數(shù)原型:void srand (usigned int seed);
srand()用來設(shè)置rand()產(chǎn)生隨機(jī)數(shù)時(shí)的隨機(jī)數(shù)種子。參數(shù)seed是整數(shù),通常可以利用time(0)或getpid(0)的返回值作為seed。
使用rand()和srand()產(chǎn)生1-100以內(nèi)的隨機(jī)整數(shù):
srand(time(0));
int number1 = rand() % 100+1。
rand和srand的用法
首先我們要對(duì)rand&srand有個(gè)總體的看法:srand初始化隨機(jī)種子,rand產(chǎn)生隨機(jī)數(shù),下面將詳細(xì)說明。
rand(產(chǎn)生隨機(jī)數(shù))
表頭文件: #includestdlib.h
定義函數(shù) :int rand(void)
函數(shù)說明 :
因?yàn)閞and的內(nèi)部實(shí)現(xiàn)是用線性同余法做的,他不是真的隨機(jī)數(shù),只不過是因?yàn)槠渲芷谔貏e長,所以有一定的范圍里可看成是隨機(jī)的,rand()會(huì)返回一隨機(jī)數(shù)值,范圍在0至RAND_MAX 間。在調(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。rand ()產(chǎn)生的是假隨機(jī)數(shù)字,每次執(zhí)行時(shí)是相同的。若要不同,以不同的值來初始化它.初始化的函數(shù)就是srand()。
返回值:
返回0至RAND_MAX之間的隨機(jī)整數(shù)值,RAND_MAX的范圍最少是在32767之間(int),即雙字節(jié)(16位數(shù))。若用unsigned int 雙字節(jié)是65535,四字節(jié)是4294967295的整數(shù)范圍。
0~RAND_MAX每個(gè)數(shù)字被選中的機(jī)率是相同的。
范例:
/* 產(chǎn)生介于1 到10 間的隨機(jī)數(shù)值,此范例未設(shè)隨機(jī)數(shù)種子,完整的隨機(jī)數(shù)產(chǎn)生請(qǐng)參考
srand()*/
#includestdlib.h
main()
{
int i,j;
for(i=0;i10;i++)
{
j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
printf("%d ",j);
}
}
執(zhí)行:
9 4 8 8 10 2 4 8 3 6
9 4 8 8 10 2 4 8 3 6 //再次執(zhí)行仍然產(chǎn)生相同的隨機(jī)數(shù)
srand(設(shè)置隨機(jī)數(shù)種子)
表頭文件:#includestdlib.h
定義函數(shù):void srand (unsigned int seed);
函數(shù)說明:
srand()用來設(shè)置rand()產(chǎn)生隨機(jī)數(shù)時(shí)的隨機(jī)數(shù)種子。參數(shù)seed必須是個(gè)整數(shù),通??梢岳胓eypid()或time(0)的返回值來當(dāng)做seed。如果每次seed都設(shè)相同值,rand()所產(chǎn)生的隨機(jī)數(shù)值每次就會(huì)一樣。
范例
/* 產(chǎn)生介于1 到10 間的隨機(jī)數(shù)值,此范例與執(zhí)行結(jié)果可與rand()參照*/
#includetime.h
#includestdlib.h
main()
{
int i,j;
srand((int)time(0));
for(i=0;i10;i++)
{
j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
printf(" %d ",j);
}
}
執(zhí)行:與rand范例比較
5 8 8 8 10 2 10 8 9 9
2 9 7 4 10 3 2 10 8 7
又或:
用"int x = rand() % 100;"來生成 0 到 100 之間的隨機(jī)數(shù)這種方法是不或取的,比較好的做法是: j=(int)(n*rand()/(RAND_MAX+1.0))產(chǎn)生一個(gè)0到n之間的隨機(jī)數(shù)
int main(void)
{
int i;
time_t t;
srand((unsigned) time(t));
printf("Ten random numbers from 0 to 99\n\n");
for(i=0; i10; i++)
printf("%d\n", rand() % 100);
return 0;
}
除以上所說的之外,補(bǔ)充一點(diǎn)就是srand這個(gè)函數(shù)一定要放在循環(huán)外面或者是循環(huán)調(diào)用的外面,否則的話得到的是相同的數(shù)字。
MSDN中的例子。
// crt_rand.c
// This program seeds the random-number generator
// with the time, then displays 10 random integers.
//
#include stdlib.h
#include stdio.h
#include time.h
int main( void )
{
int i;
// Seed the random-number generator with current time so that
// the numbers will be different every time we run.
//
srand( (unsigned)time( NULL ) );
// Display 10 numbers.
for( i = 0; i 10;i++ )
printf( " %6d\n", rand() );
printf("\n");
// Usually, you will want to generate a number in a specific range,
// such as 0 to 100, like this:
{
int RANGE_MIN = 0;
int RANGE_MAX = 100;
for (i = 0; i 10; i++ )
{
int rand100 = (((double) rand() /
(double) RAND_MAX) * RANGE_MAX + RANGE_MIN);
printf( " %6d\n", rand100);
}
}
總結(jié):
我們知道rand()函數(shù)可以用來產(chǎn)生隨機(jī)數(shù),但是這不是真真意義上的隨機(jī)數(shù),是一個(gè)偽隨機(jī)數(shù),是根據(jù)一個(gè)數(shù),我們可以稱它為種了,為基準(zhǔn)以某個(gè)遞推公式推算出來的一系數(shù),當(dāng)這系列數(shù)很大的時(shí)候,就符合正態(tài)公布,從而相當(dāng)于產(chǎn)生了隨機(jī)數(shù),但這不是真正的隨機(jī)數(shù),當(dāng)計(jì)算機(jī)正常開機(jī)后,這個(gè)種子的值是定了的,除非你破壞了系統(tǒng),為了改變這個(gè)種子的值,C提供了 srand()函數(shù),它的原形是void srand( int a) 功能是
初始化隨機(jī)產(chǎn)生器既rand()函數(shù)的初始值,即使把種子的值改成a; 從這你可以看到通過sand()函數(shù),我們是可以產(chǎn)生可以預(yù)見的隨機(jī)序列,
那我們?nèi)绾尾拍墚a(chǎn)生不可預(yù)見的隨機(jī)序列呢?我們可能常常需要這樣的隨機(jī)序列,是吧。利用srand((unsign)(time(NULL))是一種方法,因?yàn)槊恳淮芜\(yùn)行程序的時(shí)間是不同的,對(duì)了,你知道time() 函數(shù)的功能是返回從1970/01/01到現(xiàn)在的秒數(shù)的吧,可能這個(gè)起始時(shí)間不正確,你查一下對(duì)不對(duì)吧,C還提供了另一個(gè)更方便的函數(shù), randomize()
原形是void randomize(),功能是用來始初rand() 的種子的初始值,而且該值是不確定的,它相當(dāng)于srand((unsign)(time(NULL)) 不過應(yīng)注意的是randomize()的功能要通過time來實(shí)現(xiàn)所以在調(diào)用它時(shí)頭文件要包含time.h罷了
一、首先包含必要的頭文件
#includestdio.h
這個(gè)包含用于輸入輸出的函數(shù)。
#includestdlib.h
這個(gè)包含初始化隨機(jī)數(shù)種子、產(chǎn)生隨機(jī)數(shù)的函數(shù)。
#includetime.h
這個(gè)包含與時(shí)間有關(guān)的函數(shù),初始化隨機(jī)數(shù)種子時(shí)可以用到。
二、使用如下公式產(chǎn)生在區(qū)間[min,max]之間的隨機(jī)數(shù)
int r=rand()%(max-min+1)+min;
三、一個(gè)例子,產(chǎn)生10個(gè)[1,100]的隨機(jī)整數(shù)
#include stdio.h
#include stdlib.h
#include time.h
int main()
{
const int min=1,max=100;
int i,r;
//用當(dāng)前時(shí)間初始化隨機(jī)數(shù)種子
srand(time(NULL));
printf("隨機(jī)產(chǎn)生的10個(gè)1-100的整數(shù)是:");
for(i=0;i10;i++)
{
r=rand()%(max-min+1)+min;
printf("%d,",r);
}
return 0;
}
四、運(yùn)行結(jié)果的截圖
截圖1
截圖2
當(dāng)前文章:c語言rand函數(shù)例子 C語言rand函數(shù)怎么用
當(dāng)前URL:http://m.rwnh.cn/article14/doopede.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、App開發(fā)、網(wǎng)站建設(shè)、域名注冊(cè)、品牌網(wǎng)站設(shè)計(jì)、關(guān)鍵詞優(yōu)化
聲明:本網(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í)需注明來源: 創(chuàng)新互聯(lián)