出自:《C程序設計》(夏寶嵐) P76
for(i = 1; i <= 6000; i++)
f[rand() % 6]++ ; /* 數組元素下標為0到5 */
printf("Face Frequency\n");
for(face = 0; face < 6; face++)
printf("%2d %10d\n", face + 1, f[face]);
return 0;
}
運行結果(僅供參考):
===============================
Face Frequency
1 1003
2 1017
3 983
4 994
5 1004
6 999
===============================
其中rand()為庫函數,函數原型在stdlib.h中定義,其功能是產生0到32767之間的整數,而且每個整數的出現概率是相等的。由于模擬投擲骰子的程序只需要1到6之間的隨機整數,故用rand()%6作為數組下標,使數組元素下標為0到5,分別對應1到6各個面。
★ 想既然是隨機產生的數,那么每次Run時的結果應該是不一樣,但事實上并非如此,我在VC++6.0中得到的上述結果,但每次都是這些值,根本沒變。又試著在WIN-TC及TC運行,雖然數據各不相同,但在同一編譯器下的結果卻總是一樣的。
查了一下(查看出處),原來問題在這個rand()函數上。函數原型 int rand(void) 返回一個隨機數值,范圍在0到RAND_MAX之間,RAND_MAX定義在stdlib.h。看了一下VC++6.0里include目錄下的stdlib.h頭文件,里面有個"#define RAND_MAX 0x7fff"是十六進制的,也就是十進制的32767。也有稱之為偽隨機。
在調用這個函數前必須先利用srand()設置好隨機數種子。如果未設隨機數種子,rand()在調用時會自動設隨機數種子為1。是一個不變的值,這樣每次運行產生的隨機數就是一樣的。那如何才能讓其為真正的"隨機"呢?就要用srand()函數設置rand()函數產生隨機數時的隨機數種子,其原型為 void srand (unsigned int seed); 其中seed必須為整數,一般可以用geypid()或time(0)的返回值做為seed。如果每次seed都設相同值,rand()所產生的隨機數值每次就會一樣。改寫如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h> /* time()函數用 */
int main()
{
int face;
int f[6] = {0};
int i;
srand(time(0)); /* 設置種子 */
for(i = 1; i <= 6000; i++)
f[rand() % 6]++;
printf("Face Frequency\n");
for(face = 0; face < 6; face++)
printf("%2d %10d\n", face + 1, f[face]);
return 0;
}
運行結果(隨機):
==============================
Face Frequency
1 1062
2 940
3 1024
4 974
5 1029
6 971
==============================
再運行(隨機):
==============================
Face Frequency
1 978
2 990
3 991
4 1015
5 1047
6 979
==============================
★ 經過如上改動再測試,每次產生的隨機數就不一樣了。上面是隨機選的兩組結果。