C语言调用rand()生成随机数求最值程序最小值输出异常问题求解
问题原因与修复方案
核心故障点
你遇到的最小值始终输出8、位置1的问题,根源是自动填充随机数的分支没有初始化minmax结构体的max、min成员:
你在定义minmax结构体后,仅对positionMax、positionMin赋值为0,max和min是栈内存的未初始化垃圾值。而手动输入的else分支你做了正确操作:先读取第一个输入值,再将minmax.max、minmax.min初始化为第一个值,再从第二个值开始遍历比较。但随机数分支你直接用垃圾值和生成的随机数比较,如果初始的垃圾值min刚好是8,后续生成的所有随机数都大于8的情况下,min的值永远不会更新,初始的positionMin是0,输出加1就永远显示位置1,完全匹配你遇到的故障现象。
其他潜在问题
- 缺少
<time.h>头文件:你使用time(NULL)作为rand()的随机种子,但没有引入time.h头文件,部分编译器会报错或出现异常行为。 getch()是非标准函数:该函数属于<conio.h>,是Windows平台特有的非标准函数,且你没有引入对应头文件,建议替换为标准库的getchar()。
修复方案
仅需要修改随机数分支的逻辑,和手动输入分支对齐,先初始化第一个随机值作为max、min的初始值,再从第二个元素开始遍历即可:
if (y == 'Y' || y == 'y') { // 先初始化第一个元素,给max、min赋初值 a[0] = rand() % 10000 + 1; minmax.max = minmax.min = a[0]; // 循环从第二个元素开始遍历 for (i = 1; i < c; i++) { a[i] = rand() % 10000 + 1; if (minmax.max < a[i]) { minmax.max = a[i]; minmax.positionMax = i; } if (minmax.min > a[i]) { minmax.min = a[i]; minmax.positionMin = i; } } for (i = 0; i < c; i++) { printf("Number #%d: %d\n", i + 1, a[i]); } }
上述逻辑也可正常兼容c=1的边界场景。
内容的提问来源于stack exchange,提问作者user17278394
相关产品推荐
相关产品推荐

