【问题标题】:How to output the very first rolling average in a rolling average program?如何在滚动平均程序中输出第一个滚动平均值?
【发布时间】:2016-02-26 21:28:52
【问题描述】:

假设我得到了一个数字列表:8,4,5,3,2,1。
此列表的滚动平均值为:8、6、5.7、5、4.4、3.8。

我的程序使用这个算法:
新平均值 = (((旧平均值 * 第一次迭代) + 下一个数字 / (下一次迭代))。

问题是:我的程序输出所有运行平均值,除了第一个(技术上只是第一个数字,因为一个数字除以 1 就是那个数字)。它还在最后输出一个随机数。如何修复我的算法以将第一个平均值与所有其他运行平均值结合起来?旁注:在算法中,第一个“旧平均值”是第一个数字本身。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(){
    int i,n, input_cases, x;
    double numbers[100]; double previous[100];
    double mean[100]; double old_average[100]; double new_average[100];
    double *results = malloc(input_cases*sizeof(double));

    printf("Total amount of numbers: ");
        if (scanf("%d", &n) != 1) {  /* validates input */
        fprintf (stderr, "error: invalid input.\n");
        return 1;
    }
        for (i=0; i<n; i++){
            scanf("%lf", &numbers[i]);
            }
            old_average[0] = numbers[0];
        for (i=0; i<n; i++){

            new_average[i] = (((old_average[i] * (i+1)) + numbers[i+1]) / (i+2));
            old_average[i+1]=new_average[i];
            printf("%lf\n", new_average[i]);
        }


    return 0;
}

这是我的程序使用上述示例输入/输出的内容:

Input:
8
4
5
3
2
1
Output:
6.0 (This is the SECOND running average, not the first)
5.666667
5.000000
4.400000
3.830000
3.2857514 (This is the random number that doesn't belong)

【问题讨论】:

  • 尝试打印 old_average 而不是 new_average...

标签: c moving-average


【解决方案1】:

这是一个简化的版本,应该可以满足您的需求。它使用一个运行总和而不是之前的平均值,省去了不断乘除的需要,所以结果会更准确:

#include <stdio.h>

int main() {
    int i, n;
    double numbers[100];
    double sum, avg;

    printf("Total amount of numbers: ");
    if (scanf("%d", &n) != 1) {  /* validates input */
        fprintf(stderr, "error: invalid input.\n");
        return 1;
    }

    for (i=0; i<n; i++) {
        scanf("%lf", &numbers[i]);
    }

    sum = 0.0;
    for (i=0; i<n; i++) {
        sum += numbers[i];
        avg = sum / (i+1);
        printf("%lf\n", avg);
    }

    return 0;
}

【讨论】:

  • 哇。我一直在努力解决这个问题。非常感谢
  • 正确答案。您可以使用运行平均值进行计算的唯一方法是将其相乘以获得运行总和,因此将总和放在首位会更准确。 OP 所做的更像是一个 filter
  • 你能帮我扩展我的程序吗?
  • 如果您每次都打印 old_average 而不是 new_average,则原始代码可以正常工作...
  • @cleblanc 正如解释的那样,它存在准确性问题并且不必要地令人费解。你永远不想像以前那样不断地重新调整规模,这会导致累积的不准确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 2019-12-16
  • 2021-05-08
  • 2020-04-25
  • 1970-01-01
相关资源
最近更新 更多