Я пытаюсь вычислить среднее значение набора случайных чисел (все они от 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.
Есть пара проблем, которые я могу заметить здесь.
Во-первых, в каждом цикле (перед строкой 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. У меня также есть еще один вопрос. Верен ли другой цикл в отношении количества итераций?
@base12masterrace: Добро пожаловать в SO! хороший ответ. Вы можете добавить, что #define ITERATIONS L*L рискованно и должно быть написано #define ITERATIONS (L*L)
У меня есть еще один вопрос @base12masterrace. Если я установлю «y» как целое число от 0 до 100, мне также потребуется изменить «r», чтобы правильно их сравнить. Но таким образом я не получил бы такое же поведение?
@Auyk, вы можете просто разделить y на 100.0 всякий раз, когда вам нужно исходное поведение y как число от 0 до 1.
Вы должны сбросить sum_r до нуля в начале цикла