You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:45:03