Распределения. Код для распределений ч.5
Описание: описание кода генерации нормального и равномерного распределений.
Генерация подобных величин довольно проста в исполнении. Здесь мы рассмотрели алгоритмы этих распределений виде блок-схем. Теперь можно рассмотреть код данных распределений. Начнем с равномерного распределения, отрываем класс 05.cs и вставляем туда вот этот код (листинг 1):
using System; using System.Collections.Generic; using System.Text; namespace Законы_распределения.Распределения { public class _5 { private Random rnd; private Распределения.OutValues ouVal; private Распределения.EnterValues enVal; public _5(Random rnd, Распределения.OutValues ouVal, Распределения.EnterValues enVal) { this.rnd = rnd; this.enVal = enVal; this.ouVal = ouVal; } public double RavnX() { return rnd.NextDouble() * 1.0; } public void generate() { enVal._Ntb = 10; ouVal._arX = new double[enVal._N]; ouVal._NameOfR = "Равномерное распределение"; for (int i = 0; i < enVal._N; i++) { ouVal._arX[i] = RavnX(); } } } }
Все довольно просто для понимания, здесь как видно два свойства “public” (RanvX, generate()). Функция нужна для вызова равномерной величины из других распределений, а метод для генерации и вызова его из “переключателя”.
Нормальному распределению соответствует следующий код (листинг 2):
using System; using System.Collections.Generic; using System.Text; namespace Законы_распределения.Распределения { public class Norm { private Распределения.EnterValues enVal; private Распределения.OutValues ouVal; private Распределения._5 R; // public Norm(Распределения.EnterValues enVal, Распределения.OutValues ouVal, Распределения._5 R) { this.enVal = enVal; this.ouVal = ouVal; this.R = R; } // public void generate() { ouVal._arX = new double[enVal._N]; ouVal._NameOfR = "Нормальное распределение"; for (int i = 0; i < enVal._N; i++) { ouVal._arX[i] = genX(enVal._MatO_T, enVal._Sko_T); } } private double sumR() { double sum = 0; for (int i = 0; i < enVal._sumR; i++) { sum += R.RavnX(); } return sum; } public double genX(double MatO_T, double Sko_T) { //случайное число равное сумме N равномерно распределенных случайных величин double v = 0.0; // мат ожидание суммы случайных величин double mv = 0.0; // с.к.о. суммы случайных величин double qv = 0.0; // нормализованое знаение v double z = 0.0; // случайная величина с задаными с.к.о. и мат ожиданием double x = 0.0; v = sumR(); mv = enVal._sumR / 2.0; qv = Math.Sqrt(enVal._sumR / 12.0); //нормализуем полученное значение z = (v - mv) / qv; //Формулой (сдвиг на mx и масштабирование на qx) преобразуем ряд Z в ряд x x = z * Sko_T + MatO_T; return x; } } }
Все также довольно просто.
Что касается практических величин то, здесь все ясно, а вот как же сопоставить получаемые результаты теории? –О, это гораздо сложней практики, потому, как все должно соответствовать законам в учебниках, а практика в свою очередь этой теории. Переходим к следующей статье >>>