C++统计计算程序:首次随机数集合最小值始终为0的问题排查
问题排查与修复方案
核心问题1:未初始化变量导致最小值异常
你在初始化smallest_num和largest_num时,使用了未赋值的rand_num_2:
int smallest_num=rand_num_2, largest_num=rand_num_2;
rand_num_2是main函数的局部变量,未初始化时会包含随机垃圾值,在你的环境中恰好初始为0,而生成的随机数范围是1-100,后续比较时最小值自然一直停留在0。
核心问题2:拼写错误导致循环逻辑异常
循环条件中的rand_num_1-va1是拼写错误,应该是rand_num_1-1:
for (int i=0; i<=rand_num_1-va1; i++)
va1是未定义标识符,会直接导致编译失败,建议把循环条件改成i < rand_num_1,更直观且不易出错。
额外问题:累计变量未重置
当前代码中sum_of_squares仅在初始化时设为0,多次运行程序时会持续累加前一次的统计值,导致结果错误,需要在每次循环开头重置。
修复后的关键调整
修正最值初始化逻辑
将最小值初始化为随机数范围的上限(100),最大值初始化为下限(1),确保第一次比较就能正确更新:int smallest_num = MAX_SET_2; int largest_num = MIN_SET_2;修正循环条件
for (int i=0; i<rand_num_1; i++)重置累计变量
在do-while循环开头添加:sum_of_squares = 0; square_of_sum = 0; sum = 0;修复整数除法问题
原代码中average=sum/rand_num_1是整数除法,会丢失小数部分,需强制转换为浮点数:average=static_cast<float>(sum)/rand_num_1;
完整修复代码
#include<iostream> #include<iomanip> #include<cmath> #include<cstdlib> using namespace std; const int SEED_VALUE=5; const int MIN_SET_1=2; const int MAX_SET_1=15; const int MIN_SET_2=1; const int MAX_SET_2=100; int main() { int rand_num_1, rand_num_2, sum_of_squares=0, square_of_sum=0,sum=0; float average=0, standard_deviation=0; string again_value; srand(SEED_VALUE); do { cout<<"The random number are: "; int smallest_num = MAX_SET_2; int largest_num = MIN_SET_2; sum_of_squares = 0; square_of_sum = 0; sum = 0; rand_num_1=MIN_SET_1+(rand()% (MAX_SET_1-MIN_SET_1+1)); for (int i=0; i<rand_num_1; i++) { rand_num_2=MIN_SET_2+(rand()% (MAX_SET_2-MIN_SET_2+1)); cout<<rand_num_2<<" "; sum+=rand_num_2; sum_of_squares+=(rand_num_2*rand_num_2); if (rand_num_2<smallest_num) { smallest_num=rand_num_2; } if (rand_num_2>largest_num) { largest_num=rand_num_2; } } square_of_sum=sum*sum; average=static_cast<float>(sum)/rand_num_1; standard_deviation=sqrt((sum_of_squares-(static_cast<float>(square_of_sum)/rand_num_1))/(rand_num_1-1)); cout<<endl; cout<<"Number of values:"<<setw(12)<<rand_num_1<<endl; cout<<"Smallest:"<<setw(20)<<smallest_num<<endl; cout<<"Largest:"<<setw(21)<<largest_num<<endl; cout<<"Sum:"<<setw(25)<<sum<<endl; cout<<setprecision(2)<<fixed; cout<<"Average:"<<setw(21)<<average<<endl; cout<<"Standard deviation:"<<setw(10)<<standard_deviation<<endl<<endl; cout<<"Again (Y/N)? "; cin>>again_value; cout<<endl; average=0; standard_deviation=0; } while (again_value=="Y"|| again_value=="y"); return 0; }
内容的提问来源于stack exchange,提问作者Syd
相关产品推荐
相关产品推荐

