Распределения. Переключатель ч.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;
        }

Так, кажется, это все по переключателью, переходим к коду для распределений.