數據結構學習(1) c語言中關於srand((unsigned)time(NULL))和rand的區別

一直以爲rand()直接生成不同的隨機數,實驗結果不對才搜了下原因,轉載分享下…

可以認爲rand()在每次被調用的時候,它會查看:

1) 如果用戶在此之前調用過srand(seed),給seed指定了一個值,那麼它會自動調用

srand(seed)一次來初始化它的起始值。

2) 如果用戶在此之前沒有調用過srand(seed),它會自動調用srand(1)一次。

1) 如果希望rand()在每次程序運行時產生的值都不一樣,必須給srand(seed)中的seed一個變值,這個變值必須在每次程序運行時都不一樣(比如到目前爲止流逝的時間)。

2) 否則,如果給seed指定的是一個定值,那麼每次程序運行時rand()產生的值都會一樣,雖然這個值會是[seed, RAND_MAX(0x7fff))之間的一個隨機取得的值。

3) 如果在調用rand()之前沒有調用過srand(seed),效果將和調用了srand(1)再調用rand()一樣(1也是一個定值)。

stdlib.h頭文件中有宏#define RAND_MAX 0x7fff

rand()產生一個0到0x7ffff即0到32767之間的隨機數

rand()/(RAND_MAX+1.0)就等於一個0到1之間的小數了,因爲rand()最大是32767最小是0,再除以32768就是一個0到1之間的小數(不能等於1),再乘以10就是一個0到10之間的數了(不等於10).最後再加1,就成了一個求1到10之間隨機數的式子了.

srand函數是隨機數發生器的初始化函數,原型:

void srand(unsigned seed);

它需要提供一個種子,如:

srand(1);

直接使用1來初始化種子。

不過常常使用系統時間來初始化,即使用

time函數來獲得系統時間,它的返回值爲從 00:00:00 GMT, January 1, 1970

到現在所持續的秒數,然後將time_t型數據轉化爲(unsigned)型在傳給srand函數,即:

srand((unsigned) time(&t));

還有一個經常用法,不需要定義time_t型t變量,即:

srand((unsigned) time(NULL));

直接傳入一個空指針,因爲你的程序中往往並不需要經過參數獲得的t數據。

srand((int)getpid());

使用程序的ID(getpid())來作爲初始化種子,在同一個程序中這個種子是固定的

隨機輸出十個0-100之間的整數

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

void main( void )

{

int i,k;

srand( (unsigned)time( NULL ) );

for( i = 0; i < 10;i++ )

{

k=rand()%100;

printf( ” k=%d\n”, k );

}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章