C++数组累积和计算(蒙特卡洛模拟场景)问题求助
代码问题排查与修复方案
- 语法兼容性问题:你使用的变长数组
int jData[iData]属于C语言扩展特性,C++标准不支持,运行时可能出现不可预知的错误,建议替换为std::vector容器。 - 数组下标越界错误:第一个输入循环使用
i从1到iData遍历数组,而C/C++数组下标从0开始,会导致jData[0]未赋值、jData[iData]越界访问,两者都是未定义行为。 - 变量未初始化+重复定义:全局域和main函数内重复定义了
tData变量,且main内的tData未初始化就执行累加操作,统计的总数据量完全错误。 - 累积频率逻辑错误:当前两种累积和计算逻辑都不符合需求,正确的累积和应当是逐次累加前序所有概率,即第i个位置的累积频率=第i-1个位置的累积频率+第i个数据的概率。
- 区间边界逻辑缺失:你定义了区间边界数组
tepiA/tepiB但未使用,第i个数据的区间左边界为第i-1个位置的累积频率,右边界为第i个位置的累积频率,可直接用于后续蒙特卡洛随机数映射。
修复后完整代码
#include <iostream> #include <vector> #include <iomanip> #include <cmath> using namespace std; int main() { int iData; cout << "请输入数据条数: "; cin >> iData; // 替换变长数组为vector,兼容标准C++ vector<int> jData(iData); int tData = 0; // 初始化总数据量 // 输入数据,下标从0开始 for(int i=0; i<iData; i++){ cout << "请输入第" << i+1 << "条数据: "; cin >> jData[i]; tData += jData[i]; } system("cls"); vector<double> probkei(iData); vector<double> tKumul(iData); vector<double> tepiA(iData); // 区间左边界 vector<double> tepiB(iData); // 区间右边界 double cum_sum = 0.0; cout << setw(10) << "数据序号" << setw(10) << "频率" << setw(15) << "概率" << setw(20) << "累积频率" << setw(20) << "对应区间" << endl; for(int i=0; i<iData; i++){ // 计算当前概率 probkei[i] = (double)jData[i]/tData; probkei[i] = round(probkei[i] * 1000.0) / 1000.0; // 计算累积频率 cum_sum += probkei[i]; tKumul[i] = round(cum_sum * 1000.0) / 1000.0; // 计算区间边界 tepiA[i] = (i == 0) ? 0 : tKumul[i-1]; tepiB[i] = tKumul[i]; // 输出 cout << setw(10) << i+1 << setw(10) << jData[i] << setw(15) << probkei[i] << setw(20) << tKumul[i] << setw(10) << "[" << tepiA[i] << ", " << tepiB[i] << ")" << endl; } cout << setw(20) << "总数据量: " << tData << endl; return 0; }
内容的提问来源于stack exchange,提问作者Luthfi Hakim
相关产品推荐
相关产品推荐

