Распределения. Код для распределений ч.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;
        }
    }
}

Все также довольно просто.

Что касается практических величин то, здесь все ясно, а вот как же сопоставить получаемые результаты теории? –О, это гораздо сложней практики, потому, как все должно соответствовать законам в учебниках, а практика в свою очередь этой теории. Переходим к следующей статье >>>