【问题标题】:How to work out the median C# [duplicate]如何计算出C#的中位数[重复]
【发布时间】:2017-10-09 23:13:53
【问题描述】:

所以我正在努力让这件作品输出具有 4 个值的中值。 输出产生的值比实际中间值高一个,即使我将 2 更改为 2.0,我似乎也无法让它输出小数。我可以让它输出一个包含 3 个数字的值,只是用 4 个数字还没有实现。

    Console.Write("Median Value: ");
    var items = new[]{num1, num2, num3, num4 };
    Array.Sort(items);
    Console.WriteLine(items[items.Length/2]);

这项工作是我的计算课程中的一项扩展任务,因此我可能对这项任务采取了完全错误的方法。 提前致谢

【问题讨论】:

  • 用数字做一个简单的例子。数组{1, 2}的中位数是多少?
  • var mediaValue = 0.0; var items = new[] { 1, 2, 3, 4,5 }; var itemsSum = items.Sum(); var getLengthItems = items.Length; if (getLengthItems % 2 == 0) { var firstValue = items[(items.Length / 2) - 1]; var secondValue = items[(items.Length / 2)]; mediaValue = (firstValue + secondValue) / 2.0; } if (getLengthItems % 2 == 1) { mediaValue = items[(items.Length / 2)]; } Console.WriteLine(mediaValue); Console.WriteLine("输入退出!"); Console.ReadKey();

标签: c# numbers median


【解决方案1】:

如果你看Wikipedia的解释,其实很简单:

样本中位数的简单解释

在单个系列中(如果观察次数非常少),第一个必须按顺序排列所有观察结果。

那么count(n)就是给定数据中的观察总数。

如果 n 是奇数,则中位数 (M) = 第 ((n + 1)/2) 项的值。

如果 n 是偶数,则中位数 (M) = [(n/2)th item term + (n/2 + 1)th item term]/2 的值。

如何转化为代码?

using System;

namespace ConsoleApp1
{
    internal static class Program
    {
        private static void Main(string[] args)
        {
            var array = new[] {1, 2, 3, 4};

            Array.Sort(array);

            var n = array.Length;

            double median;

            var isOdd = n % 2 != 0;
            if (isOdd)
            {
                median = array[(n + 1) / 2 - 1];
            }
            else
            {
                median = (array[n / 2 - 1] + array[n / 2]) / 2.0d;
            }

            Console.WriteLine(median);
        }
    }
}

请注意,由于数组索引是从零开始的,因此在获取数组中元素的值时必须减一。

【讨论】:

    【解决方案2】:
    public decimal GetMedian(int[] array)
    {
        int[] tempArray = array;
        int count = tempArray.Length;
    
        Array.Sort(tempArray);
    
        decimal medianValue = 0;
    
        if (count % 2 == 0)
        {
            // count is even, need to get the middle two elements, add them together, then divide by 2
            int middleElement1 = tempArray[(count / 2) - 1];
            int middleElement2 = tempArray[(count / 2)];
            medianValue = (middleElement1 + middleElement2) / 2;
        }
        else
        {
            // count is odd, simply get the middle element.
            medianValue = tempArray[(count / 2)];
        }
    
        return medianValue;
    }
    

    您的实现适用于奇数大小的集合。但是在处理偶数大小的集合时,您会找到中间的一对数字,然后找到它们之间的中间值(简单算术平均值)。这很容易通过将它们相加并除以二来完成。

    基于你的代码的方法调用:

    Console.Write("Median Value: ");
    int[] items = new int[] {num1, num2, num3, num4};
    var median = GetMedian(items);
    Console.WriteLine(median);
    

    看到它在Ideone.上运行

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 2012-06-11
      • 2018-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多