隨機數,也就是在不同的時刻產生不同的數值。在UNIX操作系統和window的操作系統上,我們知道有一個函數rand,它就是用來產生隨機數的函數API接口,那麼它的原理如何實現?
如果約定a1=f(seed),an+1=f(an),那麼可以得到一個序列a1,a2,a3..an,那麼要制作一個偽隨機函數rand,只需要讓它每調用一次就返回序列的下一個元素就行。其實就是相當於第1次調用rand返回a1,第2次返回a2,…,第n次返回an,這樣每次返回的數值都不一樣,也就是相當於隨機數了。但是其實不是真正的隨機數,真正的隨機數是使用物理現象產生的:比如擲錢幣、骰子、轉輪、使用電子元件的噪音、核裂變等等。這樣的隨機數發生器叫做物理性隨機數發生器,它們的缺點是技術要求比較高。
在當前的計算機領域,許許多多的隨機數算法正是基於這樣的原理產生,一般情況下我們在平時使用rand函數的時候,需要種鐘子,也就是種隨機數種子,確保每一次產生的數值不一樣。這時候我們需要一個srand()的函數,然後在一定的時間裡time()函數產生不同的序列。
一般在寫的時候是這樣:srand(time(NULL)) ;這樣就相當於種種子。接下來我們來看一下具體的代碼:
#include執行結果:#include static unsigned int randseed; /* 實現偽隨機數的支持 */ unsigned int Curl_rand(void) { unsigned int r; /* 返回一個無符號32位整型的偽隨機數. */ r = randseed = randseed * 1103515245 + 12345; return (r << 16) | ((r >> 16) & 0xFFFF); } void Curl_srand(void) { /* 產生隨機的偽隨機數序列。 */ randseed = (unsigned int) time(NULL); Curl_rand(); Curl_rand(); Curl_rand(); } int main(void) { srand(); unsigned int i ; int j = 10; printf("產生10個隨機數:\n"); while(j != 0){ i = Curl_rand() % 100 ; printf("i:%d\n",i); j-- ; } return 0 ; }
如果不用這樣的算法,我們調用系統實現的接口是這樣:
#include運行結果:#include #include int main(void) { //種種子 srand(time(NULL)); int i ; int j ; for(i = 0 ; i < 10 ; i ++) { //產生10個100以內的隨機數 j = rand()%100 ; printf("j:%d\n",j); } return 0 ; }