Распределения. Переключатель ч.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; }
Так, кажется, это все по переключателью, переходим к коду для распределений.