rand函數功能為獲取一個偽隨機數(偽隨機數的概念下面會有介紹)。
一、函數名:
rand();
二、聲明:
int rand();
三、所在頭文件:
stdlib.h
四、功能:
返回一個偽隨機數。因為rand()內部是用線性同余法做的,在沒有其它操作下,每次執行同一個程序,調用rand得到的隨機數序列是固定的(不是真正的“隨機”)。
五、為了使rand的結果更“真”一些,也就是令其返回值更具有隨機性(不確定性),C語言在stdlib.h中還提供了srand函數,通過該函數可以設置一個隨機數種子,一般用當前時間的毫秒數來做參數。通過time(NULL)可以獲取到當前時間的毫秒值(該函數位於time.h)中。
六、使用rand的流程可以總結為:
1 調用srand((unsigned)time(NULL))設置隨機數種子,當然也可以是其他一些時間函數如 srand((UINT)GetCurrentTime()) 。
2 調用rand函數獲取一個或一系列隨機數。
需要注意的是,srand只需要在所有rand調用前,被調用一次即可,沒必要調用多次。
七、以下是隨機獲取10個整型值並輸出的例子,輔助理解。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int i;
srand((unsigned)time(NULL));//設置隨機數種子。
for(i = 0; i < 10; i ++)//運行10次。
printf("%d\n", rand());//每次獲取一個隨機數並輸出。
return 0;
}
最后,說說srand()函數 :
void srand(unsigned seed) 初始化隨機數發生器
C的函數庫之所以沒有把使用系統時鍾初始化隨機種子這步重要的操作直接放進rand函數的實現中,覺得至少有三個原因:
(1)可以高效產生連續的隨機數,不用每次都初始化;
(2)給程序員以更高的靈活性,因為可能在要求較高的場合,應該使用更好的的數據做種子,而不是系統時鍾;
(3)對於只是想產生大量偽隨機數來盡興某種驗證或者統計,未必需要初始化,大不了程序每次運行都產生同樣的一系列隨機數而已——有些情況下,這是無所謂的。
事實上有一個更重要的原因:
作為偽隨機序列產生器的rand()函數,必須具備的一個重要特性就是-》產生的序列必須是可重現的。 這不僅僅是一個算法,相當大的程度上,它關系到代碼測試的准確性。如果算法中使用了和rand()的結果相關的數據,通過一個可控的可重現序列,我們就有機會再現每一次測試的過程,從而更有效的找到問題的所在。
所以這里提出一個建議,代碼中,如果rand()的函數結果關系到算法的結果,那么,必須保證你的rand()調用是可重現的。
