потоковая передача данных в с ++ - PullRequest
0 голосов
/ 03 марта 2019

У меня есть программа, которая может генерировать случайное целое число каждые 1/10 секунды.Вот код:

int main()
{
    ofstream myfile;



    int max;

    cout << "Max number: ";
    cin >> max;

    for (int i = 0; i < max; ++i)
    {
        myfile.open("test.txt",fstream::app);
        myfile << random_int() << "\n";
        myfile.close();

        this_thread::sleep_for(chrono::milliseconds(100));
    }


    return 0;
    }

int random_int()
{
    return rand() % 10;
}

Теперь вопрос в том, что мне нужно написать программу, которая вычисляет и выдает среднее значение с той же скоростью.Если выходные данные генератора чисел:

1
2
3
4
5

Выход среднего калькулятора должен составлять

1
1
2
2
3

Каждую 1/10 секунды программа будет выводить число.

Примечание: максимальное число может быть от 0 до пары миллионов.Вычисление среднего значения путем добавления всех предыдущих чисел за интервал времени не будет идеальным.

Я студент второго курса и научный сотрудник в университете.Это упрощенная версия проблемы, с которой я сталкиваюсь в настоящее время.Любое предложение будет с благодарностью.

Обновление: спасибо за помощь от Фэй Сяна и оклара.Да, помните, что предыдущая сумма - единственный способ сделать расчет вовремя.Однако, поскольку выходной файл генератора случайных чисел постоянно меняется и новый вывод добавляется к старым выводам, я не уверен, как эффективно получать самые последние данные.

1 Ответ

0 голосов
/ 03 марта 2019

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

Скажем, у вас есть:

1
2
3
4
5

Переменная Sum равна 15. Если вы поделите на количество чисел, равное 5, вы получите ожидаемый результат 3. Продолжая, добавьте число 9, например, в переменную суммы иразделив на количество сгенерированных чисел 6, вы получите в среднем 4.

Значение i в цикле for можно использовать в качестве счетчика для количества сгенерированных чисел.Псевдокод:

sum += randomInt();
avg = sum/i;

РЕДАКТИРОВАНИЕ: Я вижу, что вы открываете и закрываете файл каждый раз в цикле for в своем сообщении.Это можно сделать вне цикла, что ускорит процесс.Если я вас правильно понимаю, ваша миссия состоит в том, чтобы сгенерировать случайное число, затем вычислить среднее значение из предыдущих чисел и, наконец, добавить его в текстовый файл?Если это так, вы находитесь на точке.

int i_random;
int avg;
int sum = 0;
myfile.open("avg.txt",fstream::app);
for (int i = 1; i < max + 1; ++i)
{
    i_random = random_int();
    sum += i_random;
    avg = sum/i;
    myfile << avg << "\n";
    this_thread::sleep_for(chrono::milliseconds(100));
}
myfile.close();

См. http://www.cplusplus.com/doc/tutorial/files/ для других операторов.Проверьте cppreference для поиска и скажите, хотите ли вы перейти к позиции в файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...