保持 x 个数字的平均值,同时仍然相加

本文关键字:数字 平均值 保持 | 更新日期: 2023-09-27 18:37:09

我需要保持滚动平均值。我需要说一个数组中有 10 个数字(或其他什么?),并不断添加并得到这些数字的平均值。

我有一个程序,每秒都会得到一个数字并将其添加到列表中。然后,我需要该列表中最后 x 个数字的平均值。还需要限制列表中的数量,以便内存不会填满,因为它每秒都会添加数字。

有人可以帮忙吗?我不知道从哪里开始

例如数组 10,9,8,7,6,5,4,3,2,1 平均值 = 5.5

将下一个数字相加 11,10,9,8,7,6,5,4,3,2 平均值 = 6.5

等等,

数组

只需要是添加到数组中的最后 10 个数字

保持 x 个数字的平均值,同时仍然相加

如果需要最后x个数字的平均值,请创建一个x值数组,并将其用作循环缓冲区

除了缓冲区之外,还保留运行总计。当有新数字进来时,查看您的循环缓冲区是否已填充。如果是,请先从汇总中减去最后一个数字,然后再添加新收到的数字。

这将允许您以 O(1) 时间而不是 O(x) 计算新的平均值,即计算时间将独立于被平均的项目数。

您可以为此使用通用列表。当您要计算最后 10 个元素的平均值时,请确保检查它是否实际包含至少 10 个元素。

var list = new List<int>();
list.Add(5);
//....
var average = list.Skip(list.Count - 10).Average();

我会为此使用链表。这使得列表管理变得简单且"低成本"。调整大多数其他类型的容器的大小可能需要在内存中随机排列数据。从前面删除是LinkedList的优势所在。

//make a linked list and fill it...
LinkedList<int> list = new LinkedList<int>(Enumerable.Repeat(0,10));
list.AddLast(0);
while(list.Count > 10)
{
    list.RemoveFirst();
}
var avg = list.Average();

您可以使用列表而不是数组轻松执行此操作

只需对列表大于预期进行 if 检查,然后让它从列表中删除第一项。

List<int> Numbers = new List<int>();
if (Numbers.Count > 10)
{
    Numbers.RemoveRange(0, 0);
}
Numbers.Add(11);
var NewAverage = Numbers.Average();

如果数组看起来像示例中的数组,您可以简单地观察到,每次在数组的一端添加一个新数字并从另一端删除一个数字时,平均值都会上升 1。 所以你根本不需要数组——你只需要在i中添加 5.5 即可。

对于i = 0

(10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1) / 10 = 5.5 = 5.5 + i

对于i = 1

(11 + 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2) / 10 = 6.5 = 5.5 + i

对于i = 2

(12 + 11 + 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3) / 10 = 7.5 = 5.5 + i

。(你明白了)