保持平均x个数字,同时仍然添加

时间:2015-01-12 14:00:23

标签: c# arrays

我需要保持滚动平均值。我需要说一个数组中有10个数字(或者别的什么?)并继续添加到这个并得到这些数字的平均值。

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

任何人都可以提供帮助?我不知道从哪里开始

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

添加下一个号码11,10,9,8,7,6,5,4,3,2 average = 6.5

等等,

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

5 个答案:

答案 0 :(得分:4)

如果您需要最后x个数字的平均值,请创建一个x值数组,并将其用作circular buffer

除缓冲区外还保留运行总计。当有新号码进入时,查看您的循环缓冲区是否已填满。如果是,则在添加新接收的号码之前从运行总计中减去最后一个数字。

这将允许您计算O(1)时间内的新平均值而不是O(x),即计算时间将与平均项目数无关。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

我为此使用链接列表。这使得列表管理变得简单并且成本低廉[#34;调整大多数其他类型的容器的大小可能需要在内存中混洗数据。从前面删除是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();

答案 3 :(得分:0)

如果数组看起来与您的示例中的数组类似,那么您可以简单地观察到,每次向数组的一端添加新数字并从另一端删除一个数字时,平均值会增加1.所以你不要根本不需要数组 - 你只需要将5.5添加到i

代表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

......(你明白了)

答案 4 :(得分:0)

您可以使用列表而不是数组

轻松完成此操作

只需检查列表是否比您想要的大,然后让它从列表中删除第一项。

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