Распределения. Код для распределений ч.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;
}
}
}Все также довольно просто.
Что касается практических величин то, здесь все ясно, а вот как же сопоставить получаемые результаты теории? –О, это гораздо сложней практики, потому, как все должно соответствовать законам в учебниках, а практика в свою очередь этой теории. Переходим к следующей статье >>>