【问题标题】:Can I calculate the average of these numbers?我可以计算这些数字的平均值吗?
【发布时间】:2008-12-04 12:08:37
【问题描述】:

我想知道如果我有这个,是否可以计算一些数字的平均值:

int currentCount = 12;
float currentScore = 6.1123   (this is a range of 1 <-> 10).

现在,如果我收到另一个分数(比如说 4.5),我可以重新计算平均值,这样它会是这样的:

int currentCount now equals 13
float currentScore now equals ?????

或者这是不可能的,我仍然需要记住分数列表?

【问题讨论】:

    标签: math average


    【解决方案1】:

    以下公式可让您根据您的要求仅从存储的平均值和计数中跟踪平均值。

    currentScore = (currentScore * currentCount + newValue) / (currentCount + 1)
    currentCount = currentCount + 1
    

    这取决于您当前的平均值是您的总和除以计数这一事实。因此,您只需将计数乘以平均值即可得到总和,将新值相加并除以 (count+1),然后增加计数。

    所以,假设您有数据{7,9,11,1,12},而您唯一要保留的是平均值和计数。随着每个数字相加,您会得到:

    +--------+-------+----------------------+----------------------+
    | Number | Count |   Actual average     | Calculated average   |
    +--------+-------+----------------------+----------------------+
    |      7 |     1 | (7)/1           =  7 | (0 * 0 +  7) / 1 = 7 |
    |      9 |     2 | (7+9)/2         =  8 | (7 * 1 +  9) / 2 = 8 |
    |     11 |     3 | (7+9+11)/3      =  9 | (8 * 2 + 11) / 3 = 9 |
    |      1 |     4 | (7+9+11+1)/4    =  7 | (9 * 3 +  1) / 4 = 7 |
    |     12 |     5 | (7+9+11+1+12)/5 =  8 | (7 * 4 + 12) / 5 = 8 |
    +--------+-------+----------------------+----------------------+
    

    【讨论】:

    • 我担心舍入误差的累积。存储计数和总和,而不是运行平均值,可以减少这种情况(但不会消除它)。
    • Pax - 我应该使用什么类型的数据库字段?
    • @Pure,DB 和数据库一样吗?我不确定你在这里问什么。
    • @slim,四舍五入是对的,但除非您对绝对大量的数字进行平均,否则相对误差通常保持在很低的水平。
    • @Pax:我假设 currentScore 的类型是 FLOAT。因此,我是否也应该将此字段作为 DB 类型 FLOAT 或 DECIMAL(10,2) 的 DB 类型或其他东西存储在数据库中?
    【解决方案2】:

    我喜欢存储总和和计数。它避免了每次额外的乘法。

    current_sum += input;
    current_count++;
    current_average = current_sum/current_count;
    

    【讨论】:

    • 保持总和是一个很好的观点,特别是如果您可以推迟平均,直到您对所有数字求和。
    • 但我们不应该把它变成一个相互钦佩的社会:-)
    • 完全正确;通常,您可以使用幂和来计算第 n 个时刻。例如,您可以计算 std.dev。平方和,总和和计数。但是,如果您需要流媒体标准。开发。不要那样做,这样做:cs.berkeley.edu/~mhoemmen/cs194-fall2007/Tutorials/variance.pdf
    • 你的头发很棒!哦对不起。我们决定不建立相互钦佩的社会......
    【解决方案3】:

    当您查看平均值公式时,这真的很容易:A1 + A2 + ... + AN/N。现在,如果您有旧平均值和 N(数字计数),您可以轻松计算新平均值:

    newScore = (currentScore * currentCount + someNewValue)/(currentCount + 1)
    

    【讨论】:

      【解决方案4】:

      您可以存储 currentCount 和 sumScore,然后计算 sumScore/currentCount。

      【讨论】:

        【解决方案5】:

        或者......如果你想傻,你可以在一行中完成:

         current_average = (current_sum = current_sum + newValue) / ++current_count;
        

        :)

        【讨论】:

        • 如果我做 ++current_count 和 current_count++ 有什么区别吗??
        • 是的。一个在计算 current_average 之前增加 current_count,另一个在计算之后增加。
        • 所以 ++current_count 在除法完成之前递增,而 current_count++ 在除法之后递增吗?哎哟!只是通过查看代码,我会认为它会是......“并将左侧除以右侧,即(当前计数 + 1)。很高兴我问了!
        • 在 C 或 C++ 中确实如此。但不是在Java中。答案因语言而异!
        【解决方案6】:

        float currentScore 现在等于 (currentScore * (currentCount-1) + 4.5)/currentCount ?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-15
          • 2016-05-27
          • 1970-01-01
          • 1970-01-01
          • 2012-04-11
          • 2021-01-12
          相关资源
          最近更新 更多