標準庫<cstdlib>(被包含於<iostream>中)提供兩個協助產生偽隨機數的函數:
從srand (seed)中指定的seed開始,返回一個[seed, RAND_MAX(0x7fff))間的隨機整數。
函數二:void srand(unsigned seed);
參數seed是rand()的種子,用來初始化rand()的起始值。(一般情況下:我們都使用time(NULL)種子, 從一個時間點(一般是1970年1月1日0時0分0秒)到那時的秒數(即日曆時間))
這個是bcc55中的定義,說明這個整數的最大數是0x7fffu,u代表unicode編碼。
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也是一個定值)。
1) 給srand()提供一個種子,它是一個unsigned int類型;
2) 調用rand(),它會根據提供給srand()的種子值返回一個隨機數(在0到RAND_MAX之間);
3) 根據需要多次調用rand(),從而不間斷地得到新的隨機數;
4) 無論什麼時候,都可以給srand()提供一個新的種子,從而進一步“隨機化”rand()的輸出結果。
// crt_rand.c// This program seeds the random-number generator// with the time, then exercises the rand function.//#include <stdlib.h>#include <stdio.h>#include <time.h>void SimpleRandDemo( int n ){ // Print n random numbers. int i; for( i = 0; i < n; i++ ) printf( " %6d\n", rand() );}void RangedRandDemo( int range_min, int range_max, int n ){ // Generate random numbers in the half-closed interval // [range_min, range_max). In other words, // range_min <= random number < range_max int i; for ( i = 0; i < n; i++ ) { int u = (double)rand() / (RAND_MAX + 1) * (range_max - range_min) + range_min; printf( " %6d\n", u); }}int main( void ){ // Seed the random-number generator with the current time so that // the numbers will be different every time we run. srand( (unsigned)time( NULL ) ); SimpleRandDemo( 10 ); printf("\n"); RangedRandDemo( -100, 100, 10 );}