在C语言中计算带条件的随机数平均值及迭代次数的问题求解
问题分析与代码修正
问题描述
需要计算0到1之间每个步长为0.01的float变量y对应的0-1随机数平均值,同时需结合ITERATIONS参数控制计算次数,但现有代码运行后平均值大于1,且迭代逻辑不符合预期。
错误原因
- 累加变量未重置:
sum_r在整个程序中仅初始化一次,每次处理新的y或迭代时未重置,导致之前所有随机数的和被持续累加,最终平均值远超合理范围。 - 迭代逻辑混乱:当前代码在每个
y的每次迭代后,直接用累计的sum_r除以STEPS写入文件,混淆了单次迭代累加和与总累加和的关系,不符合“每个y对应一组随机数平均值”的需求。 - 浮点精度隐患:使用
float y += 0.01更新y,因浮点数精度限制,可能导致y无法精确取到0.01、0.02等数值,循环次数易出现偏差。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <time.h> #define L 2 #define STEPS 10 #define ITERATIONS L*L // 每个y下的迭代次数,每次迭代生成STEPS个随机数 int main() { FILE *doc = fopen("document.txt", "w"); if (!doc) { // 增加文件打开失败的容错判断 perror("Failed to open file"); return 1; } srand((unsigned)time(0)); // 初始化随机数种子 fprintf(doc, "y mean of r \n\n"); // 用整数计数避免浮点精度问题,遍历0.00到0.99共100个y值 for (int count = 0; count < 100; count++) { float y = count * 0.01f; float total_sum = 0.0f; int total_samples = ITERATIONS * STEPS; // 每个y下完成所有迭代的随机数生成与累加 for (int iter = 0; iter < ITERATIONS; iter++) { for (int t = 0; t < STEPS; t++) { float r = (float)rand() / RAND_MAX; total_sum += r; // 可选:打印单个随机数到控制台 // printf("y=%.2f, r=%f\n", y, r); } } // 计算当前y对应的总平均值并写入文件 float mean_r = total_sum / total_samples; fprintf(doc, "%.2f %.4f \n\n", y, mean_r); } fclose(doc); return 0; }
代码说明
- 重置累加变量:每个
y的计算开始前,重新初始化total_sum,确保仅累加当前y对应的随机数。 - 修正迭代逻辑:每个
y下先完成所有迭代的随机数生成与累加,再计算总平均值并写入文件,匹配“每个y对应一组随机数平均值”的需求。 - 解决精度问题:通过整数
count循环100次,计算y = count * 0.01f,保证y的取值精确为0.00、0.01…0.99。 - 增加容错判断:添加
fopen失败的检查,避免程序无提示崩溃。 - 清晰的平均值计算:总样本数为
ITERATIONS * STEPS,用总累加和除以总样本数得到准确的平均值。
如果需要每个y下输出每次迭代的单独平均值(而非总平均值),可调整代码如下:
// 替换原循环部分 for (int count = 0; count < 100; count++) { float y = count * 0.01f; fprintf(doc, "当y=%.2f时\n", y); fprintf(doc, " 每次迭代的平均值:\n"); for (int iter = 0; iter < ITERATIONS; iter++) { float iter_sum = 0.0f; for (int t = 0; t < STEPS; t++) { float r = (float)rand() / RAND_MAX; iter_sum += r; } float iter_mean = iter_sum / STEPS; fprintf(doc, " %.4f\n", iter_mean); } fprintf(doc, "\n"); }
内容的提问来源于stack exchange,提问作者Auyk
相关产品推荐
相关产品推荐

