//основной метод
 public void Generate()
 {
     Drawer drawer = new Drawer();//художник рисующий вывески
     drawer.Clear(data.Controll1);//очистка полотен
     drawer.Clear(data.Controll2);
     drawer.Clear(data.Controll3);
     //создание экземпляра генератора
     generator = new DiscreteInverseGenerator(data.Values);
     for (int i = 0; i < data.SamplingVolume; i++)//генерация выборки
     {
         lock (Answer)//синхронизация по контейнеру с результатами
         {
             Answer.progress = 2 * (i + 1);//задание текущего прогресса
         }
         sampling.AddValue(generator.GenerateValue());//добавление сгенерированного значения к выборке
     }
     //создаём экземпляр контроллера критерия пирсона
     PirsonController PirsonControl = new PirsonController(data.Controll3, sampling, Answer, 2, data.Values.Count, null);
     Thread PirsonThread = new Thread(PirsonControl.Calculate);//помещаем конроллер в нить
     PirsonThread.Start();//запускаем нить
     //создаём экземпляр контроллера критерия колмогорова
     KolmogorovController KolmogorovControl = new KolmogorovController(data.Controll2, sampling, Answer, 2);
     Thread KolmogorovThread = new Thread(KolmogorovControl.Calculate);//помещаем контроллер в нить
     KolmogorovThread.Start();// запускаем нить
     drawer.DrawGraph1(data.Controll1, sampling, 2);
     lock (Answer)
     {
         Answer.sampling = sampling;//ложим выборку в контейнер результов
         Answer.GenerationFinished = true;//вычисления завершены
     }
 }
        public void Calculate()
        {
            PirsonCriterion Criterion = new PirsonCriterion(sampling, Intervals);//критерий пирсона
            Drawer drawer = new Drawer();//художник рисующий вывески
            if (sampling.GetVolume() >= 100)//критерий не вычисляется если объём выборки <100
            {
                PirsonContainer PirsonAnswer = Criterion.Calculate(FuncType);//вычисление критерия
                lock (Answer)
                {
                    //сохраниение результатов
                    Answer.Pirson = PirsonAnswer;
                    Answer.PirsonCalculated = true;
                    Answer.progress += sampling.GetVolume();//прогресс +25%
                }
                if(FuncType==0)
                {
                    //отрисовка графика
                    drawer.DrawGraph3(DrawPanel, PirsonAnswer, FuncType, UniversalBorders);
                }
                else
                {
                    drawer.DrawGraph3(DrawPanel, PirsonAnswer, FuncType);//отрисовка графика
                }

            }
            //если критерий не вычисляется
            else
            {
                drawer.Clear(DrawPanel);//очистка полотна
            }
            lock(Answer)
            {
                Answer.PirsonFinished = true;//вычисления завершены
            }
        }