1. 程式人生 > >隨機數---秒及毫秒級隨機數種子(C++)

隨機數---秒及毫秒級隨機數種子(C++)

一、函式
1、rand
函式原型: int rand(void);
所在標頭檔案: stdlib.h
功能描述: rand()的內部實現是用線性同餘法做的,它不是真的隨機數,因其週期特別長,故在一定的範圍裡可看成是隨機的。rand()返回一隨機數值的範圍在0至RAND_MAX 間。RAND_MAX的範圍最少是在32767之間(int),用unsigned int 雙位元組是65535,四位元組是4294967295的整數範圍。0~RAND_MAX每個數字被選中的機率是相同的。使用者未設定隨機數種子時,系統預設的隨機數種子為1。rand()產生的是偽隨機數字,每次執行時是相同的,若要不同,用函式srand()初始化它。

2、srand
函式原型: void srand(unsigned int seed);
所在標頭檔案: stdlib.h
功能描述: srand()用來設定rand()產生隨機數時的隨機數種子。引數seed必須是個整數,通常可以利用time(0)的返回值或NULL來當做seed。如果每次seed都設相同值,rand()所產生的隨機數值每次就會一樣。

3、time
函式原型: time_t time(time_t *t);
所在標頭檔案: time.h
返回值:成功則返回秒數,失敗則返回((time_t)-1)值,錯誤原因存於errno 中
功能描述: 此函式會返回從公元 1970 年1 月1 日的UTC 時間從0 時0 分0 秒算起到現在所經過的秒數。如果t 並非空指標的話,此函式也會將返回值存到t 指標所指的記憶體。

4、ftime
函式原型: int ftime(struct timeb *tp);
所在標頭檔案: sys/timeb.h
返回值:無論成功或失敗都返回0
功能描述: ftime()將目前日期由tp所指的結構返回。tp結構定義:

struct   timeb{
       time_t   time;                    /* 為1970-01-01至今的秒數*/
       unsigned   short   millitm;       /* 千分之一秒即毫秒 */
       short   timezonel;       /* 為目前時區和Greenwich相差的時間,單位為分鐘 */
short dstflag; /* 為日光節約時間的修正狀態,如果為非0代表啟用日光節約時間修正 */ };

二、程式碼例項:

1、以秒為隨機數種子

unsigned int tseed = time(NULL);
srand(tseed);
unsigned int crand = rand();

2、以秒為隨機數種子產生一定範圍內的數值

unsigned int tseed = time(NULL);
srand(tseed);
// 生成[b,a]範圍內的數值,包括b和a
unsigned int range = a - b + 1;
unsigned int crand = rand() % range + b;
// 生成[b,a)範圍內的數值,包括b,不包括a
unsigned int range = a - b;
unsigned int crand = rand() % range + b;

3、以毫秒為隨機數種子

struct timeb timeSeed;
ftime(&timeSeed);
srand(timeSeed.time * 1000 + timeSeed.millitm);  // milli time
unsigned int crand = rand();

4、以毫秒為隨機數種子產生一定範圍內的數值

struct timeb timeSeed;
ftime(&timeSeed);
srand(timeSeed.time * 1000 + timeSeed.millitm);  // milli time
// 生成[b,a]範圍內的數值,包括b和a
unsigned int range = a - b + 1;
unsigned int crand = rand() % range + b;
// 生成[b,a)範圍內的數值,包括b,不包括a
unsigned int range = a - b;
unsigned int crand = rand() % range + b;