rand和srand的用法
創(chuàng)新互聯(lián)專注于化隆企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站建設(shè),商城建設(shè)。化隆網(wǎng)站建設(shè)公司,為化隆等地區(qū)提供建站服務(wù)。全流程按需定制網(wǎng)站,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
首先我們要對rand&srand有個總體的看法:srand初始化隨機種子,rand產(chǎn)生隨機數(shù),下面將詳細(xì)說明。
rand(產(chǎn)生隨機數(shù))
表頭文件: #includestdlib.h
定義函數(shù) :int rand(void)
函數(shù)說明 :
因為rand的內(nèi)部實現(xiàn)是用線性同余法做的,他不是真的隨機數(shù),只不過是因為其周期特別長,所以有一定的范圍里可看成是隨機的,rand()會返回一隨機數(shù)值,范圍在0至RAND_MAX 間。在調(diào)用此函數(shù)產(chǎn)生隨機數(shù)前,必須先利用srand()設(shè)好隨機數(shù)種子,如果未設(shè)隨機數(shù)種子,rand()在調(diào)用時會自動設(shè)隨機數(shù)種子為1。rand ()產(chǎn)生的是假隨機數(shù)字,每次執(zhí)行時是相同的。若要不同,以不同的值來初始化它.初始化的函數(shù)就是srand()。
返回值:
返回0至RAND_MAX之間的隨機整數(shù)值,RAND_MAX的范圍最少是在32767之間(int),即雙字節(jié)(16位數(shù))。若用unsigned int 雙字節(jié)是65535,四字節(jié)是4294967295的整數(shù)范圍。
0~RAND_MAX每個數(shù)字被選中的機率是相同的。
范例:
/* 產(chǎn)生介于1 到10 間的隨機數(shù)值,此范例未設(shè)隨機數(shù)種子,完整的隨機數(shù)產(chǎn)生請參考
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)生相同的隨機數(shù)
srand(設(shè)置隨機數(shù)種子)
表頭文件:#includestdlib.h
定義函數(shù):void srand (unsigned int seed);
函數(shù)說明:
srand()用來設(shè)置rand()產(chǎn)生隨機數(shù)時的隨機數(shù)種子。參數(shù)seed必須是個整數(shù),通??梢岳胓eypid()或time(0)的返回值來當(dāng)做seed。如果每次seed都設(shè)相同值,rand()所產(chǎn)生的隨機數(shù)值每次就會一樣。
范例
/* 產(chǎn)生介于1 到10 間的隨機數(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 之間的隨機數(shù)這種方法是不或取的,比較好的做法是: j=(int)(n*rand()/(RAND_MAX+1.0))產(chǎn)生一個0到n之間的隨機數(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;
}
除以上所說的之外,補充一點就是srand這個函數(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)生隨機數(shù),但是這不是真真意義上的隨機數(shù),是一個偽隨機數(shù),是根據(jù)一個數(shù),我們可以稱它為種了,為基準(zhǔn)以某個遞推公式推算出來的一系數(shù),當(dāng)這系列數(shù)很大的時候,就符合正態(tài)公布,從而相當(dāng)于產(chǎn)生了隨機數(shù),但這不是真正的隨機數(shù),當(dāng)計算機正常開機后,這個種子的值是定了的,除非你破壞了系統(tǒng),為了改變這個種子的值,C提供了 srand()函數(shù),它的原形是void srand( int a) 功能是
初始化隨機產(chǎn)生器既rand()函數(shù)的初始值,即使把種子的值改成a; 從這你可以看到通過sand()函數(shù),我們是可以產(chǎn)生可以預(yù)見的隨機序列,
那我們?nèi)绾尾拍墚a(chǎn)生不可預(yù)見的隨機序列呢?我們可能常常需要這樣的隨機序列,是吧。利用srand((unsign)(time(NULL))是一種方法,因為每一次運行程序的時間是不同的,對了,你知道time() 函數(shù)的功能是返回從1970/01/01到現(xiàn)在的秒數(shù)的吧,可能這個起始時間不正確,你查一下對不對吧,C還提供了另一個更方便的函數(shù), randomize()
原形是void randomize(),功能是用來始初rand() 的種子的初始值,而且該值是不確定的,它相當(dāng)于srand((unsign)(time(NULL)) 不過應(yīng)注意的是randomize()的功能要通過time來實現(xiàn)所以在調(diào)用它時頭文件要包含time.h罷了
rand(產(chǎn)生隨機數(shù))
相關(guān)函數(shù)
srand
表頭文件
#includestdlib.h
定義函數(shù)
int rand(void)
函數(shù)說明
rand()會返回一隨機數(shù)值,范圍在0至RAND_MAX 間。在調(diào)用此函數(shù)產(chǎn)生隨機數(shù)前,必須先利用srand()設(shè)好隨機數(shù)種子,如果未設(shè)隨機數(shù)種子,rand()在調(diào)用時會自動設(shè)隨機數(shù)種子為1。關(guān)于隨機數(shù)種子請參考srand()。
返回值
返回0至RAND_MAX之間的隨機數(shù)值,RAND_MAX定義在stdlib.h,其值為2147483647。
范例
/* 產(chǎn)生介于1 到10 間的隨機數(shù)值,此范例未設(shè)隨機數(shù)種子,完整的隨機數(shù)產(chǎn)生請參考
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
srand(設(shè)置隨機數(shù)種子)
相關(guān)函數(shù)
rand
表頭文件
#includestdlib.h
定義函數(shù)
void srand (unsigned int seed);
函數(shù)說明
srand()用來設(shè)置rand()產(chǎn)生隨機數(shù)時的隨機數(shù)種子。參數(shù)seed必須是個整數(shù),通常可以利用geypid()或time(0)的返回值來當(dāng)做seed。如果每次seed都設(shè)相同值,rand()所產(chǎn)生的隨機數(shù)值每次就會一樣。
返回值
范例
/* 產(chǎn)生介于1 到10 間的隨機數(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í)行
5 8 8 8 10 2 10 8 9 9
2 9 7 4 10 3 2 10 8 7
rand()
rand()函數(shù)用來產(chǎn)生隨機數(shù),但是,rand()的內(nèi)部實現(xiàn)是用線性同余法實現(xiàn)的,是偽隨機數(shù),由于周期較長,因此在一定范圍內(nèi)可以看成是隨機的。
rand()會返回一個范圍在0到RAND_MAX(至少是32767)之間的偽隨機數(shù)(整數(shù))。
在調(diào)用rand()函數(shù)之前,可以使用srand()函數(shù)設(shè)置隨機數(shù)種子,如果沒有設(shè)置隨機數(shù)種子,rand()函數(shù)在調(diào)用時,自動設(shè)計隨機數(shù)種子為1。隨機種子相同,每次產(chǎn)生的隨機數(shù)也會相同。
rand()函數(shù)需要的頭文件是:stdlib.h
rand()函數(shù)原型:int rand(void);
使用rand()函數(shù)產(chǎn)生1-100以內(nèi)的隨機整數(shù):int number1 = rand() % 100+1。
srand()
srand()函數(shù)需要的頭文件仍然是:stdlib.h
srand()函數(shù)原型:void srand (usigned int seed);
srand()用來設(shè)置rand()產(chǎn)生隨機數(shù)時的隨機數(shù)種子。參數(shù)seed是整數(shù),通??梢岳胻ime(0)或getpid(0)的返回值作為seed。
使用rand()和srand()產(chǎn)生1-100以內(nèi)的隨機整數(shù):
srand(time(0));
int number1 = rand() % 100+1。
a的類型不對
rand 的返回值是int型
你賦值給double了
把a改成int
然后再試試
如果還是相同 那么打印一下隨機到的a值。
另外 srand在程序運行開始的時候調(diào)用一次就好,不要每次函數(shù)內(nèi)都調(diào)用一次。
這樣如果一秒內(nèi)調(diào)用多次 就會出現(xiàn)你說的情況。
網(wǎng)站欄目:c語言rand函數(shù)返回 c語言中rand函數(shù)的使用方法
文章鏈接:http://jinyejixie.com/article38/ddojdpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、網(wǎng)站排名、網(wǎng)站設(shè)計公司、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站營銷、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)