Ienumerator и ienumerables - C#

Формулировка задачи:

КАК Реализовать расчет математического ожидания и дисперсии для ряда псевдослучайных чисел. Ряд чисел должен генерироваться функцией, возвращающей IEnumerable<double> и принимающей в качестве параметра требуемое количество чисел в ряде.

Код к задаче: «Ienumerator и ienumerables - C#»

textual
using System;
using System.Collections.Generic;
using System.Linq;
using Excel = Microsoft.Office.Interop.Excel;
 
namespace TriangularDistribution
{
    public class TriangularDistribution
    {
        public readonly double Mean; // Матожидание
        public readonly double Variance; // Дисперсия
        public readonly double StandardDeviation; // СКО
        public readonly double Skewness; // Коэффициент ассиметрии
        public const double Kurtosis = -0.6; // Коэффициент эксцесса
 
        private readonly Random _r = new Random();
        private readonly double _a;
        private readonly double _b;
        private readonly double _ba;
        private readonly double _ca;
 
 
        public TriangularDistribution(double a, double b, double c)
        {
            _a = a;
            _b = b;
            _ba = b - a;
            _ca = c - a;
            Mean = (a + b + c) / 3.0;
            Variance = (a * a + b * b + c * c - a * b - a * c - b * c) / 18.0;
            StandardDeviation = Math.Sqrt(Variance);
            double d = a * a + b * b + c * c - a * b - a * c - b * c;
            Skewness = 1.414 * (a + b - 2 * c) * (2 * a - b - c) * (a - 2 * b + c) / (5 * d * Math.Sqrt(d));
        }
 
 
        public double Next()
        {
            double x = _r.NextDouble();
            if (x <= _ca / _ba)
                return _a + Math.Sqrt(x * _ba * _ca);
            return _b - Math.Sqrt((1 - x) * _ba * _ca);
        }
    }
 
 
    public class Program
    {
        private static double Mx(IEnumerable<double> a)
        {
            return a.Sum() / a.Count();
        }
 
 
        private static void Main()
        {
            const int a = 0, b = 4, c = 4;
            Console.Write("Введите размер выборки: ");
            int n = int.Parse(Console.ReadLine());
            var r = new TriangularDistribution(a, b, c);
            var ar = new double[n];
            for (int i = 0; i < ar.Length; i++)
                ar[i] = r.Next();
            //Матожидание 
            var mx = Mx(ar);
            //Дисперсия
            var v2 = Mx(ar.Select(x => x * x));
            var dx = v2 - mx * mx;
            //СКО
            var sigma = Math.Sqrt(dx);
            //Коэф. ассиметрии
            var v3 = Mx(ar.Select(x => x * x * x));
            var m3 = v3 - 3 * mx * v2 + 2 * mx * mx * mx;
            var As = m3 / (sigma * sigma * sigma);
            //Эксцесс
            var v4 = Mx(ar.Select(x => x * x * x * x));
            var m4 = v4 - 4 * mx * v3 + 6 * mx * mx * v2 - 3 * mx * mx * mx * mx;
            var ex = m4 / (sigma * sigma * sigma * sigma) - 3;
            var excelApp = new Excel.Application();
            excelApp.Workbooks.Add();
            int rowIndex = 1, colIndex = 1;
            excelApp.Cells[rowIndex, colIndex++] = "Исходный ряд: X";
            foreach (var x in ar)
                excelApp.Cells[rowIndex, colIndex++] = x;
            rowIndex++;
            colIndex = 1;
            excelApp.Cells[rowIndex, colIndex++] = "Вариационный ряд: X";
            Array.Sort(ar);
            foreach (var x in ar)
                excelApp.Cells[rowIndex, colIndex++] = x;
            rowIndex+=3;
            excelApp.Cells[rowIndex, 1] = "Значение";
            excelApp.Cells[rowIndex, 2] = "Теоретическое";
            excelApp.Cells[rowIndex, 3] = "Статистическое";
            excelApp.Cells[rowIndex, 4] = "Разница в %";
            rowIndex++;
            Print(excelApp, "Mx", ref rowIndex, mx, r.Mean);
            Print(excelApp, "Dx", ref rowIndex, dx, r.Variance);
            Print(excelApp, "Ax", ref rowIndex, As, r.Skewness);
            Print(excelApp, "Ex", ref rowIndex, ex, TriangularDistribution.Kurtosis);
            excelApp.Columns.AutoFit();
            excelApp.Visible = true;
        }
 
 
        private static void Print(Excel.Application excelApp, string name, ref int rowIndex, double statist, double teor)
        {
            const int prec = 3;
            excelApp.Cells[rowIndex, 1] = name;
            excelApp.Cells[rowIndex, 2] = Math.Round(teor, prec);
            excelApp.Cells[rowIndex, 3] = Math.Round(statist, prec);
            excelApp.Cells[rowIndex, 4] = Math.Round(Math.Abs(1 - statist / teor) * 100, prec);
            rowIndex++;
        }
    }
}

14   голосов, оценка 4.286 из 5


СОХРАНИТЬ ССЫЛКУ