C语言用rand()模拟两次掷骰子36000次统计结果异常问题咨询
你遇到的异常输出是数组未初始化导致的:
- C语言中定义在函数内部的局部自动变量(你代码里的
measure[13]数组属于这类),不会被自动初始化为0,其初始值是对应内存空间残留的随机无效值 - 你直接对
measure[die1+die2]执行自增操作,是在随机初始值的基础上累加,所以最终输出结果会出现远大于36000的离谱数值,其余数值看起来接近预期只是巧合
修正方案
只需要在定义数组时手动将所有元素初始化为0即可,修改数组定义行的代码为:int die1, die2, count, measure[13] = {0};
注:C语言中数组初始化时如果显式给第一个元素赋值为0,剩下所有未显式赋值的元素都会被自动初始化为0,刚好满足计数需求。另外原代码要正常编译运行,还需要在开头引入头文件
<stdio.h>(提供printf的声明)和<stdlib.h>(提供srand、rand的声明)。
修正后的完整代码如下:
#include <stdio.h> #include <stdlib.h> int main(void) { srand(3); int die1, die2, count, measure[13] = {0}; for(count=0; count<36000; count++){ die1=1+rand()%6; die2=1+rand()%6; measure[die1+die2]++; } printf("Results!\n"); printf("Sum%20s\n", "Frequency"); for(count=2; count<=12; count++){ printf("%3d%20d\n", count, measure[count]); } return 0; }
内容的提问来源于stack exchange,提问作者udhav varma
相关产品推荐
相关产品推荐

