1. 程式人生 > >C語言隨機數的產生

C語言隨機數的產生

除錯環境:win10+vs2015

在程式設計中我們經常需要使用隨機數用來進行測試,因此就需要使用到rand()函式,這裡就來詳解一下C語言隨機數生成器。

rand()函式的原型是:int rand ( void );
該函式不需要傳參,返回一個偽隨機整數範圍在0到RAND_MAX

在vs2015中,RAND_MAX的定義為:
#define RAND_MAX 0x7fff
也就是十進位制的32767

在rand()函式中內部是去找srand()函式,經過一個演算法生成隨機數。
那麼我們就需要了解一下srand()函數了

srand():初始化隨機數發生器
srand()的函式原型:void srand(unsigned int _Seed);


該函式需要傳入一個無符號的整形引數,沒有返回值

總體上的意思就是:
給srand()函式傳一個引數,作為rand()函式的種子,rand()函式用這個種子經過一個演算法生成一個0到RAND_MAX的隨機數,但是這樣問題就來了,該演算法是定死了的,也就是說給srand()函式傳的引數如果相同的話就會產生相同的隨機數,這樣的隨機數稱之為偽隨機數。如果要每次得到的隨機數都不一樣就需要換一個種子,所以我們就需要使用time()函式,將現在的時間毫秒值作為種子,因為毫秒單位時間變化比較快,所以這樣可以將數做的更隨機。

time():時間函式
time()函式原型:time_t time ( time_t * timer );


傳入一個time_t指標型別的引數,返回一個time_t型別的值

在vs2015裡面time_t的定義為

typedef long __time32_t;
typedef __time32_t time_t;

也即time_t是一個long型別的。

經測試,不管傳入引數是time_t型別的指標還是NULL都會返回當前時間的毫秒值。
這樣隨機函式就完美實現了。

總結:首相呼叫time()函式獲取當前時間毫秒值,再將其傳入srand()函式生成種子,最後經rand()函式的演算法產生一個由當前毫秒數產生的隨機值。