private List<Point> Values = new List<Point>(); //массив точек(точки вида: значение, вероятность)

        #endregion Fields

        #region Constructors

        //конструктор
        private DiscreteDistributionFunction(List<Point> values)
        {
            func = this;//сохраняем в func адрес создаваемого объекта
            Values = values;//сохраняем пришедшие точки
            double control = 0;// проверяем чтобы суммарная вероятность была равна 1
            for (int i = 0; i < Values.Count; i++)
            {
                control += Values[i].GetP;
            }
            int tochnost = 10000;//настройка точности проверки 10000-до 4 знака, 1000 - до 3 знака включительно и т.д.
            if ((Math.Round(control * tochnost) / tochnost) != 1)
            {
                //Проверка на то, что суммарная вероятность около 1
                throw new Exception("Суммарная вероятность должна быть равна 1\n");
            }
        }
 //конструктор
 public DiscreteInverseGenerator(List<Point> Values)
 {
     Function = DiscreteDistributionFunction.Create(Values);//получаем экземпляр функции распределения
 }
 //метод создания
 public static DiscreteDistributionFunction Create(List<Point> values)
 {
     func = new DiscreteDistributionFunction(values);//создаем экземпляр функции
     return func;//возвращаем созданный объект
 }
 //приватный конструктор
 private DiscreteDistributionFunction()
 {
     func = this;//запрещает создание через конструктор напрямую
 }