C++统计随机数组元素频率输出乱数、整数除法结果异常问题
问题原因
- 数组下标越界:C++中动态分配的数组下标从0开始,你定义的
randomNumbers数组长度为outputLength,合法下标范围是0 ~ outputLength-1,但你填充数组时循环从i=1到i=outputLength,写入randomNumbers[i]时会越界访问非法内存,破坏内存数据。 - 计数数组未初始化:
new int[highestNumber]申请的内存不会自动清零,数组初始值都是随机垃圾值,直接在其基础上做累加操作,结果必然异常。 - 计数逻辑错误:统计频率时你只循环了
highestNumber次,仅读取了randomNumbers的前highestNumber个元素,没有遍历所有生成的随机数,统计逻辑完全错误。 - 输出时下标再次越界:
numberCounter数组长度为highestNumber,合法下标范围是0 ~ highestNumber-1,输出时你从i=1开始遍历到highestNumber,再次触发越界访问。 - 频率计算逻辑错误:两个int类型做除法默认是整数除法,会直接舍弃小数部分,要得到正确的频率占比需要转成浮点数计算。
- 动态申请的内存未释放:程序结束前没有
delete释放randomNumbers和numberCounter数组,存在内存泄漏问题。
修正后代码
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { int highestNumber, outputLength, result; cout << "你想要生成的最大数字是多少?: "; cin >> highestNumber; cout << "你想要生成的数字序列长度是多少?: "; cin >> outputLength; cout << "好的,我们将生成" << outputLength << "个范围为1到" << highestNumber << "的数字!\n"; srand(time(NULL)); int * randomNumbers = new int[outputLength]; for (int i = 0; i < outputLength; i++) { result = rand() % highestNumber + 1; cout << result << ", "; randomNumbers[i] = result; } // 申请数组时加括号自动初始化为0 int * numberCounter = new int[highestNumber](); cout << "\n频率统计:\n"; // 遍历所有随机数统计出现次数 for (int i = 0; i < outputLength; i++) { int temp2 = randomNumbers[i]; numberCounter[temp2 - 1]++; } for (int i = 0; i < highestNumber; i++) { // 转浮点数计算频率占比 double frequency = (double)numberCounter[i] / outputLength; cout << "数字" << i+1 << " 出现" << numberCounter[i] << "次,占比为" << frequency << "\n"; } // 释放动态申请的内存 delete[] randomNumbers; delete[] numberCounter; return 0; }
内容的提问来源于stack exchange,提问作者burnershuff
相关产品推荐
相关产品推荐

