模拟抛硬币(C语言实现)

实现代码:

 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

转载于:https://www.cnblogs.com/geekham/p/4097472.html

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值