實現代碼:
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int heads() 5 { 6 return rand() < RAND_MAX/2; 7 } 8 9 int main(int argc, char *argv[]) 10 { 11 int i,j,cnt; 12 int N = atoi(argv[1]), M = atoi(argv[2]); 13 int *f = malloc((N+1)*sizeof(int)); 14 15 for(j=0; j<=N; j++) f[j] = 0; 16 for(i=0; i<M; i++, f[cnt]++) 17 for(cnt=0, j=0; j<N; j++)//j<=N on book. 18 if(heads())cnt++; 19 20 for(j=0; j<=N; j++) 21 { 22 printf("%2d ", j); 23 for(i=0; i<f[j]; i+=10) printf("*"); 24 printf("\n"); 25 } 26 27 system("pause"); 28 return 0; 29 }
該程序引自《算法:C語言實現(第1~4部分)》,主要學習基於計算出的值作為數組索引的操作。
第17行代碼中注釋處為做的修改,原書中為j<=N,我認為應該為j<N,否則假如heads()的返回值一直為真即拋硬幣結果永遠為正面,則參數cnt的值最后結果為N+1, 超出最大可能出現的次數。
將代碼保存為coin.c,編譯生成coin.exe. 假設模擬1000次的“拋硬幣32次”,即N=32,M=1000,通過命令行向main()函數傳遞這兩個參數並執行,結果如下:
D:\>coin.exe 32 1000
0
1
2
3
4
5
6 *
7 *
8 *
9 *
10 **
11 ****
12 ******
13 ********
14 ************
15 *************
16 **************
17 *************
18 *************
19 ********
20 ******
21 ***
22 *
23 *
24 *
25 *
26
27
28
29
30
31
32
請按任意鍵繼續. . .
圖中每個星號代表10次出現正面。
假設模擬10000次的“拋硬幣32次”,即N=32,M=10000,並將代碼中第23行i+=10改為i+=20后重新編譯生成coin.exe,通過命令行向main()函數傳遞N、M兩個參數並執行,其結果如下:
D:\>coin.exe 32 10000
0
1
2
3
4
5
6 *
7 *
8 **
9 ****
10 *********
11 ***************
12 ****************************
13 ****************************************
14 *****************************************************
15 ********************************************************************
16 ***************************************************************************
17 ******************************************************************
18 *********************************************************
19 ****************************************
20 **************************
21 *************
22 ********
23 ***
24 *
25 *
26 *
27
28 *
29
30
31
32
請按任意鍵繼續. . .
參考文獻:《算法:C語言實現(第1~4部分)》,機械工業出版社,2011.8