Как рассчитать среднее значение набора случайных чисел, включая дополнительные условия в 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.

Вы должны сбросить sum_r до нуля в начале цикла

base12masterrace 22.02.2023 05:17
Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из...
Разница между Angular и React
Разница между Angular и React
React и AngularJS - это два самых популярных фреймворка для веб-разработки. Оба фреймворка имеют свои уникальные особенности и преимущества, которые...
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
1
1
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 при печати.

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

Спасибо. На самом деле я каждый раз добавляю 0,01 к y. У меня также есть еще один вопрос. Верен ли другой цикл в отношении количества итераций?

Auyk 22.02.2023 10:47

@base12masterrace: Добро пожаловать в SO! хороший ответ. Вы можете добавить, что #define ITERATIONS L*L рискованно и должно быть написано #define ITERATIONS (L*L)

chqrlie 22.02.2023 11:23

У меня есть еще один вопрос @base12masterrace. Если я установлю «y» как целое число от 0 до 100, мне также потребуется изменить «r», чтобы правильно их сравнить. Но таким образом я не получил бы такое же поведение?

Auyk 22.02.2023 19:59

@Auyk, вы можете просто разделить y на 100.0 всякий раз, когда вам нужно исходное поведение y как число от 0 до 1.

base12masterrace 23.02.2023 00:52

Другие вопросы по теме