显示文件中随机数的更新平均值
Display an updated average of random numbers in a file
我有一个程序可以在文件 .
中显示一个随机数。
#include <iostream>
#include <fstream>
#include <random>
using namespace std;
int main() {
std::ofstream file("file.txt",std::ios_base::app);
int var = rand() % 100 + 1;
file<<var ;
return 0;
}
4 次试验后的结果:
1,2 2,20 3,40 1,88
我希望不显示数字。但只有在每次尝试后更新平均值。
有什么方法可以逐步计算平均值吗?
文件中应该只存在平均值:
例如初审:
1.2
第二次试验显示文件中的平均值 (1.2+2.2)/2
1.7
您可以使用一些简单的数学运算来逐步计算平均值。但是,您必须计算有多少值对平均值有贡献。
假设您有 n 个平均值为 m 的数字。您的下一个数字 x 通过以下方式对平均值做出贡献:
m = (mn + x)/(n+1)
除以平均值然后再乘以回去对性能不利。我建议你存储总和和数字。
(pseudocode)
// these variables are stored between function calls
int sum
int n
function float getNextRandomAverage() {
int rnd = getOneRandom()
n++;
sum += rnd;
float avg = sum/n
return avg
}
function writeNextRandomAverage() {
writeToFile(getNextRandomAverage())
}
我也觉得你的方法关闭文件很奇怪。它怎么知道应该关闭它?如果稍后要使用该文件怎么办? (比如说,连续使用这种方法)。
虽然这有点奇怪,但您正在尝试做的事情,而且我相信有更好的方法可以做到,下面是您可以如何做到的:
float onTheFlyAverage()
{
static int nCount=0;
float avg, newAvg;
int newNumber = getRandomNum();
nCount++; //increment the total number count
avg = readLastAvgFromFile(); //this will read the last average in your file
newAvg = avg*(nCount-1)/nCount+ (float)(newNumber)/nCount;
return newAvg;
}
如果出于某种原因您想在作为程序输入提供的文件中保留平均值并希望它为您保持平均数字(一种停止和继续功能),您将必须save/load 文件中的总数以及平均值。
但是,如果您一次性完成,这应该可行。恕我直言,这远不是最好的方法 - 但你已经知道了:)
注意:我没有处理除以 0 的极端情况;我把它留给你。
我有一个程序可以在文件 .
中显示一个随机数。#include <iostream>
#include <fstream>
#include <random>
using namespace std;
int main() {
std::ofstream file("file.txt",std::ios_base::app);
int var = rand() % 100 + 1;
file<<var ;
return 0;
}
4 次试验后的结果:
1,2 2,20 3,40 1,88
我希望不显示数字。但只有在每次尝试后更新平均值。 有什么方法可以逐步计算平均值吗?
文件中应该只存在平均值:
例如初审:
1.2
第二次试验显示文件中的平均值 (1.2+2.2)/2
1.7
您可以使用一些简单的数学运算来逐步计算平均值。但是,您必须计算有多少值对平均值有贡献。
假设您有 n 个平均值为 m 的数字。您的下一个数字 x 通过以下方式对平均值做出贡献:
m = (mn + x)/(n+1)
除以平均值然后再乘以回去对性能不利。我建议你存储总和和数字。
(pseudocode)
// these variables are stored between function calls
int sum
int n
function float getNextRandomAverage() {
int rnd = getOneRandom()
n++;
sum += rnd;
float avg = sum/n
return avg
}
function writeNextRandomAverage() {
writeToFile(getNextRandomAverage())
}
我也觉得你的方法关闭文件很奇怪。它怎么知道应该关闭它?如果稍后要使用该文件怎么办? (比如说,连续使用这种方法)。
虽然这有点奇怪,但您正在尝试做的事情,而且我相信有更好的方法可以做到,下面是您可以如何做到的:
float onTheFlyAverage()
{
static int nCount=0;
float avg, newAvg;
int newNumber = getRandomNum();
nCount++; //increment the total number count
avg = readLastAvgFromFile(); //this will read the last average in your file
newAvg = avg*(nCount-1)/nCount+ (float)(newNumber)/nCount;
return newAvg;
}
如果出于某种原因您想在作为程序输入提供的文件中保留平均值并希望它为您保持平均数字(一种停止和继续功能),您将必须save/load 文件中的总数以及平均值。
但是,如果您一次性完成,这应该可行。恕我直言,这远不是最好的方法 - 但你已经知道了:)
注意:我没有处理除以 0 的极端情况;我把它留给你。