我有一个程序,可以每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到几百万。通过在该时间间隔内将所有先前的数字相加来计算平均值是不理想的。
我是大二学生,是大学的研究助理。这是我当前遇到的问题的简化版本。任何建议将不胜感激。
更新:感谢Fei Xiang和oklar的帮助。是的,请记住先前的总和是及时进行计算的唯一方法。但是,由于随机生成器的输出文件不断变化,并且新的输出将附加到旧的输出,因此我不确定如何有效地获取最新数据。
答案 0 :(得分:0)
您无需计算每次都添加的所有数字,只需将最后一个数字添加到sum变量中,然后除以生成的数字量即可。
说你有
1
2
3
4
5
求和变量为15。如果将其除以数量5,则将得到预期的输出3。继续,将数字9加到求和变量中,然后除以生成的数量6,平均结果为4。
for循环中的i可以用作生成数字数量的计数器。伪代码:
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进行查找,并告诉您是否要跳至文件中的某个位置。