C# 有序列表中的最大平均数列

C# 有序列表中的最大平均数列,c#,C#,我试图得到列表中不同持续时间的最大平均值 假设我有以下数据: var randomList = new List<int>(); var random = new Random(1969); for (var i = 0; i < 10; i++) { randomList.Add(random.Next(0, 500)); } 我试图得到不同集合0-9的最高平均值 集合0(一行中的一项)=413(索引3) 集合1(一行两项)=252(平均指数3,4) 集合9(一行

我试图得到列表中不同持续时间的最大平均值

假设我有以下数据:

var randomList = new List<int>();
var random = new Random(1969);

for (var i = 0; i < 10; i++)
{
    randomList.Add(random.Next(0, 500));
}
我试图得到不同集合0-9的最高平均值

集合0(一行中的一项)=413(索引3)

集合1(一行两项)=252(平均指数3,4)

集合9(一行10项)=179(整个列表的平均值)

这件事我已经绞尽脑汁好一阵子了。我正试图找到一种有效的方法来写这篇文章,以便尽可能减少遍历次数。在生产中,我会列出3500-6000分的列表


如何找到不同集合0-9的最高平均值?

这可能不是最有效的方法,但效果很好:

基本上,我们使用堆栈来跟踪所遍历的项目。然后,为了计算
n
最后一项的平均值,我们从堆栈中查看
n

void Main()
{
    var randomList = new List<int>();
    var random = new Random(1969);

    for (var i = 0; i < 10; i++)
    {
        randomList.Add(random.Next(0, 500));
    }

    // Use the values from the original post for validation
    randomList = new List<int> { 190, 279, 37, 413, 90, 131, 64, 129, 287, 172 };

    const int numSets = 9;
    var avgDict = Enumerable.Range(1, numSets).ToDictionary(e => e, e => (double)0);
    var s = new Stack<int>();
    foreach (var item in randomList)
    {
        s.Push(item);
        for (var i = 1; i <= numSets; i++)
        {
            if (s.Count >= i)
            {
                var avg = s.Take(i).Average();
                if (avg > avgDict[i])
                    avgDict[i] = avg;
            }
        }
    }
    avgDict.Dump();
}

当我们只需要9-10个项目时,我不确定对大型列表使用
堆栈的含义。可能是定制有限大小堆栈的一个很好的例子

在您的评论中,您提到了
Avg(项目:0,1,2)vs Avg(项目:1,2,3)vs Avg(项目:2,3,4)

不确定这是否是你想要的,但我想出了这个

首先,得到随机数,然后得到3个数的平均值。然后,得到最大的平均值

    static void Main(string[] args)
    {
        var randomList = new List<int>();
        var random = new Random(1969);
        int TotalRandomNumber = 10; //Change this accordingly
        for (var i = 0; i < TotalRandomNumber ; i++)
        {
            randomList.Add(random.Next(0, 500));
        }

        foreach (var item in randomList)
        {
            Console.WriteLine("Random Number: " + item);
        }

        var AveNum = new List<double>();
        int range = 3; //Change this for different range
        for (int i = 1; i < TotalRandomNumber - range; i++)
        {
            var three = randomList.GetRange(i, range);
            double result = three.Average();
            Console.WriteLine("Average Number: " + result);
            AveNum.Add(result);
        }

        Console.WriteLine("Largest: " + AveNum.Max());
    }
static void Main(字符串[]args)
{
var randomList=新列表();
var random=新随机(1969年);
int TotalRandomNumber=10;//相应地更改此值
对于(变量i=0;i
通常,您是如何计算集合的最高平均值的?他们对此有什么方程式吗?在你方的努力下,你是如何计算出连续两项的503的,而这些数字都不超过413?(这只是总数,不是平均数)@un lucky只是一系列物品的平均值。因此,平均值(项目:0,1,2)与平均值(项目:1,2,3)与平均值(项目:2,3,4)等。这是一行中的三个项目。我已经试过很多次了,但这是一个愚蠢的代码,不起作用。@DavidG啊,我以前试过一种求和技术,我试图从列表开头的和中减去一个数字,然后添加最新的数字,并将其与前一个和进行比较。当我写出来的时候,我忘了把503/2分开。现在修好了,有意思的问题。然而,我看不到比暴力更好的方法。你是否有意将randomList设置为新列表两次。。。因为它完全覆盖了为其添加值的for循环…代码转储也对这里的任何人都没有帮助。此问题不在topc中,应该关闭。@ChrisThompson是的,它有意根据问题复制“随机”值以验证output@Rob使用堆栈的想法非常棒。我不确定这是否能经受住OP要求的6000项列表,但你的方法在遍历所有总和方面非常棒。它太宽了,因为它要求我们为他们编写代码,而不是要求调试帮助。还有,你愿意我投票关闭而不是留下来帮忙吗?因为这肯定是毫无帮助的?
1 413 
2 251.5 
3 243 
4 229.75 
5 201.8 
6 190 
7 183.714285714286 
8 178.75 
9 180
    static void Main(string[] args)
    {
        var randomList = new List<int>();
        var random = new Random(1969);
        int TotalRandomNumber = 10; //Change this accordingly
        for (var i = 0; i < TotalRandomNumber ; i++)
        {
            randomList.Add(random.Next(0, 500));
        }

        foreach (var item in randomList)
        {
            Console.WriteLine("Random Number: " + item);
        }

        var AveNum = new List<double>();
        int range = 3; //Change this for different range
        for (int i = 1; i < TotalRandomNumber - range; i++)
        {
            var three = randomList.GetRange(i, range);
            double result = three.Average();
            Console.WriteLine("Average Number: " + result);
            AveNum.Add(result);
        }

        Console.WriteLine("Largest: " + AveNum.Max());
    }