Распределения. Переключатель ч.4
Описание: описание кода для переключения между разными распределениями (SwitchOn.cs)
Этот переключатель необходим (SwitchOn.cs) для правильного генерирования случайных чисел, а именно подключить нужный код для генерирования СВ. Например, мы хотим сгенерировать случайную величину, да не одну, распределенную по нормальному закону, затем посмотреть результат и сравнить с другим законом. Это, пока, возможно сделать с помощью, так называемого, “переключателя”, он будет подключать необходимые объекты классов, функции и методы.
Первое, что необходимо сделать, это придумать опознавательные знаки для каждого распределения. Такими знаками являются “Tab” радио кнопок, они передаются в качестве глобальных величин объекте. Переменные, применяемые в этом объекте класса, прописаны в листинге 1.
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Data;
namespace Законы_распределения.Распределения
{
public class SwitchOn
{
private Распределения.EnterValues enVal = new EnterValues(); //входные параметры
private Распределения.OutValues ouVal;
private usrcAll cnlAll; //общий контрол для пользователя
private frmResult frmRes; //форма результата
private Законы_распределения.Общие.Global Gl; //некторые глобальные переменные
//
private string Razdel = ";";
//
private Распределения.Functoins Func; //объект класса с набором разных функций
private Распределения.Processing Pr; //объекта класса с набором главных процедур
private Распределения._5 R; //равномерное 1
private Распределения._5 R2; //равномерное 2
private Распределения.Norm nrm; //нормальное 1
private Распределения.Norm nrm2; //нормальное 1
private Random rnd; //рандом 1
private Random rnd2;//рандом 2
/*
* в некоторых будующих распределениях необходимы несколько независимых первоначальных величин
* */
private Распределения.Collections Collect = new Collections(); //коллекции опытов
//
private string commandText = "";
//
public SwitchOn(Законы_распределения.Общие.Global Gl)
{
rnd = new Random();
rnd2 = new Random();
this.Gl = Gl;
}
//
private int rdChoice = 0; //выбранная кнопка
private int NumExperience = 0; //номер эксперемента по счету
private int AllExperience = 0; //сколько всего нужно эксперементов
private int ComplExperience; //количество законченных эксперементов
private int iExperience = 0; //индекс
private bool rdGen = true; //делать генерацию
private int CountLikeExp; //кол похожих эксперементов
//
public int _rdChoice { get { return rdChoice; } set { rdChoice = value; } }
public int _NumExperience { get { return NumExperience; } }
public int _AllExperience { get { return AllExperience; } }
public int _ComplExperience { get { return ComplExperience + 1; } }
public int _iExperience { get { return iExperience + 1; } }
public bool _rdGen { get { return rdGen; } set { rdGen = value; } }
public int _CountLikeExp { get { return CountLikeExp; } set { CountLikeExp = value; } }
public OutValues _ouVal { get { return ouVal; } }
public EnterValues _enVal { get { return enVal; } set { enVal = value; } }
public Законы_распределения.usrcAll _cnlAll { set { cnlAll = value; } }
public Законы_распределения.Распределения.Functoins _Func { get { return Func; } set { Func = value; } }
}
}Все необходимые переменные у нас есть, теперь нужно добавить пару функций: запуск генератора (листинг 2) и выбор распределения (листинг 3).
public Распределения.OutValues Gen()
{
Gl._frmA.tslblAction.Text = "Генерация";
Gl._frmA.tsProgrBar.Minimum = 0;
Gl._frmA.tsProgrBar.Maximum = enVal._NeedExper;
Gl._frmRes.btStart.Text = "Остановить";
//
NumExperience = 0;
do
{
ouVal = new Распределения.OutValues();
if (suitable(createX()) == true)
{
NumExperience++;
NeedCollections().Add(ouVal);
addToTable(NeedTable());
//
Gl._frmA.tsLblTextAct.Text = NumExperience + " / " + enVal._NeedExper;
Gl._frmA.Update();
}
AllExperience++;
Gl._frmA.tsProgrBar.Value = NumExperience;
ouVal = null;
}
while (NumExperience < enVal._NeedExper);
iExperience = NeedCollections().Count - 1;
ComplExperience = NeedCollections().Count - 1;
ouVal = ViewExperience(ComplExperience);
Gl._frmA.tsLblTextAct.Text = "Готово!";
Gl._frmRes.btStart.Text = "Сгенерировать";
return ouVal;
} private Распределения.OutValues createX()
{
R = new _5(rnd, ouVal, enVal);
//
Func = new Functoins(ouVal, enVal);
Pr = new Processing(ouVal, enVal, Func, this);
switch (rdChoice)
{
case 10://Равномерное
{
R.generate();
break;
}
case 11://Нормальное
{
nrm = new Norm(enVal, ouVal, R);
nrm.generate();
break;
}
}
Pr.Calculation();
return ouVal;
}Как вы можете видеть в моем варианте кода присутствует еще несколько необходимых функция: поддверждение всех условий (листинг 4) – “suitable(createX())”, “NeedCollections()” – необходим для выбора коллекции с нужным распределением (листинг 5), “ViewExperience(ComplExperience)” – эта функция выдает самые последний результат в форму вывода (листинг 6).
private bool suitable(Распределения.OutValues ouVal)
{
//frmRes.grpParams.Controls[1];
if (cnlAll.chkVar.Checked)
{
if (ouVal._sumNi != enVal._N)
{
return false;
}
else if (Math.Abs(ouVal._MatO - ouVal._MatO_T) > enVal._Otkl)
{
return false;
}
else if (Math.Abs(ouVal._Disp - ouVal._Disp_T) > enVal._Otkl)
{
return false;
}
else if (Math.Abs(ouVal._Sko - ouVal._Sko_T) > enVal._Otkl)
{
return false;
}
}
return true;
}private ArrayList NeedCollections()
{
ArrayList ActiveList = new ArrayList();
if (rdGen)
{
switch (rdChoice)
{
case 10:
{
ActiveList = Collect._lstR;
break;
}
case 11:
{
ActiveList = Collect._lstNorm;
break;
}
}
}
else
{
switch (rdChoice)
{
case 10:
{
ActiveList = Collect._lstRS;
break;
}
case 11:
{
ActiveList = Collect._lstNormS;
break;
}
}
}
return ActiveList;
}public Распределения.OutValues ViewExperience(int N)
{
ouVal = (Распределения.OutValues)NeedCollections()[iExperience];
return ouVal;
}Так, кажется, это все по переключателью, переходим к коду для распределений.