1.首先說說rand()函數
rand()函數相當於一個隨機數字生成器,生成數字的大小范圍是0-32767(先前沒有調用srand(seed))。
那麼為什麼范圍會是0-32767呢?
0:在使用rand()函數之前沒有調用srand(seed),則系統會默認調用srand(0),而srand(seed)函數中的seed可以理解為隨機數的最小值。
32767:這個數值大小換為十六進制即為0x7fff,這個數被定義在<stdlib.h>這個頭文件中,定義宏:#define RAND_MAX 0x7fff。
就是說rand()隨機值得最大值被固定為32767(注意:這個數不是2^16-1,不是65536,不是二個字節能表示的最大值)
也就是說使用rand()函數必須包含頭文件<stdlib.h>.
2.再來說說srand(seed);
srand(seed)相當於是rand()使用前的聲明,當然你不聲明系統會默認給你聲明,seed就是生成隨機數的最小值。
下面是一段實例代碼:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 int a[10],i = 0; 7 srand(0); 8 for(;i < 10;i++) 9 { 10 a[i] = rand(); 11 printf("%d,",a[i]); 12 } 13 }
這是運行結果:
產生是全是0-32767之間的數。。。。。。
不過這樣使用這個函數從嚴格意義上來說不是隨機的,只是在某種規則下隨機。
例如我第二次在運行此函數:
你會發現每次運行數組得到的值完全一樣,只是數組內的數值隨機了。
如果你確定一個seed值,比如上面代碼中的0,你每次運行程序的隨機值會一模一樣,即我第二次運行上述程序,得到的隨機值會和第一次運行得到的隨機值一摸一樣。
那如何做到真正的獲取隨機值呢?那麼就必須每次運行程序的srand(seed)中的seed值不同,那麼得到的數組值也就不同,也就實現了真正的隨機數。
這個就要用到time這個函數了。
3.聲明srand((unsigned)time(NULL))來實現真正的隨機
首先time()函數是用來獲取從1970年1月1日零時零分零秒到目前為止所經過的時間,單位為秒,包含在頭文件<time.h>中
因為時間是不斷流逝的,所以使用這個函數來當做seed的值,那麼每次seed的值不同,rand()也就是真正的隨機了。
因為我們不需要參數來記錄傳遞值,所以一般使用time(NULL),並且強制轉化為unsigned類型。
也就成了srand((unsigned)time(NULL)).......................
將上面的代碼中srand(0)改為srand((unsigned)time(NULL)),並加上頭文件<time.h>則程序運行的結果如下:
第一次:
第二次:
這樣我們每次運行得到的就是不同的值了。