Ienumerator и ienumerables - C#
Формулировка задачи:
КАК Реализовать расчет математического ожидания и дисперсии для ряда псевдослучайных чисел. Ряд чисел должен генерироваться функцией, возвращающей IEnumerable<double> и принимающей в качестве параметра требуемое количество чисел в ряде.
Решение задачи: «Ienumerator и ienumerables»
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++; } } }