Как рассчитать среднее значение набора случайных чисел, включая дополнительные условия в C?

Я пытаюсь вычислить среднее значение набора случайных чисел (все они от 0 до 1), учитывая, выполняются ли другие условия. То есть вычислить среднее значение списка случайных чисел для каждого значения float y, пока оно меньше 1. Мне также нужно учитывать количество итераций, необходимых для этого.

Ниже приведен код, который я написал до сих пор:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

#define L 2
#define STEPS 10
#define ITERATIONS L*L

FILE *doc;

int main() {
    doc = fopen("document.txt", "w");
    float y = 0.0;
    float r;
    float sum_r = 0.0;
    float mean_r = 0.0;
    srand((unsigned)time(0));

    fprintf(doc, "y    mean of r \n\n");

    while (y < 1) { 
        for (int iter = 0; iter < ITERATIONS; iter++) {
            for (int t = 0; t < STEPS; t++) {
                r = rand() / (float)RAND_MAX;
                printf("r=%f\n", r);
                sum_r += r;
            }
            mean_r = sum_r / (float)STEPS;
                
            fprintf(doc," %f          %f \n\n", y, mean_r);
        }   
        y = y + 0.01;
    }   
    fclose(doc);
    return 0;
}

Проблема в том, что я получаю средние значения выше 1, а это неправильно. Кроме того, я точно не знаю, как включить ITERATIONS, так как я каждый раз получаю неверные значения среднего значения этих чисел.

Примечание:

Мне нужно получить что-то вроде

for y=0.00
   calculate the average of:
        0.3545
        0.5678
        0.2346
           .
           .
           .
        0.6786

for y=0.01
   calculate the average of:
        0.7893
        0.1234
        0.3899
           .
           .
           .
        0.8726

for y=0.02
           .
           .
           .
           .


and so on only while `y` is less than 1 and considering the number of iterations.

🤔 А знаете ли вы, что...
C - это язык программирования, который был создан в начале 1970-х годов.


1
52
1

Ответ:

Решено

Есть пара проблем, которые я могу заметить здесь.

Во-первых, в каждом цикле (перед строкой for (int t = 0; t < STEPS; t++) вам нужно сбросить sum_r на 0, иначе вы получите среднее значение выше 1.

Во-вторых, вы обнаружите, что y оказывается больше 1, потому что арифметика с плавающей запятой не совсем точна. Когда вы прибавляете 0,1 к y несколько раз, в конечном итоге получается 0,9999999 вместо 1. Было бы лучше установить y как целое число и повторять до тех пор, пока y не станет 100, добавляя 1 каждый раз. Затем просто разделите y на 100 при печати.

Есть еще несколько вопросов, касающихся стиля кода, но это лучше оставить для обсуждения на форуме по обзору кода.