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