【问题标题】:Display an updated average of random numbers in a file显示文件中随机数的更新平均值
【发布时间】:2015-06-12 08:18:59
【问题描述】:

我有一个程序在文件中显示一个随机数。

#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

【问题讨论】:

  • @Nick 你是对的,我的错。这是不正确的,因为我忘记将 oldAvg 与旧计数相乘。因此,整个公式是错误的。我删了

标签: c++ file-io average


【解决方案1】:

尽管这有点奇怪,但您正在尝试做的事情,而且我确信有更好的方法,您可以这样做:

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;
}

如果出于某种原因您希望在作为程序输入的文件中保留平均值,并希望它继续为您平均数字(一种停止和继续功能),您将必须保存/加载文件中的总数以及平均值。

但是,如果您一次性完成,这应该可以。恕我直言,这远不是最好的方法 - 但你有它:)

注意:有一个除以 0 的极端情况我没有处理;我把它留给你。

【讨论】:

    【解决方案2】:

    您可以使用一些简单的数学来逐步计算平均值。但是,您必须计算有多少值对均值有贡献。

    假设您有 n 个平均值为 m 的数字。您的下一个数字 x 通过以下方式对平均值产生影响:

    m = (mn + x)/(n+1)

    【讨论】:

      【解决方案3】:

      将平均值除以然后乘以对性能不利。我建议你存储总和和数字。

      (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())
      }
      

      您的方法关闭文件对我来说也很奇怪。它怎么知道应该关闭它?如果以后要使用该文件怎么办? (比如说,这种方法的连续使用)。

      【讨论】:

      • 对我来说看起来不错,尽管 sum 和 n 都应该初始化为 0。;)
      • @HaukeS 在我的伪代码变量中是自动初始化的 ;)
      • @Nick Volynkin 但这不是从文件中获取最后一个值并计算平均值的增量平均值。
      • @Alexander 你想从文件中取出最后一个值吗?无论如何,您必须存储附加值的数量。
      猜你喜欢
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 2014-11-03
      • 2023-03-27
      • 2023-03-13
      • 2016-06-27
      • 2017-01-23
      • 1970-01-01
      相关资源
      最近更新 更多