Преобразование равномерно распределенной случайной величины в нормально распределенную

    Этот вопрос уже давно подробно изучен, и наиболее широкое распространение получил метод полярных координат, предложенный Джорджем Боксом, Мервином Мюллером и Джорджем Марсальей в 1958 году. Данный метод позволяет получить пару независимых нормально распределенных случайных величин с математическим ожиданием 0 и дисперсией 1 следующим образом:
    алгоритм марсалья marsaglia
    где Z0 и Z1 — искомые значения, s = u2 + v2, а u и v — равномерно распределенные на отрезке (-1, 1) случайные величины, подобранные таким образом, чтобы выполнялось условие 0 < s < 1.
    Многие используют эти формулы, даже не задумываясь, а многие даже и не подозревают об их существовании, так как пользуются готовыми реализациями. Но есть люди, у которых возникают вопросы: «Откуда взялась эта формула? И почему получается сразу пара величин?». Далее я постараюсь дать наглядный ответ на эти вопросы.


    Для начала напомню, что такое плотность вероятности, функция распределения случайной величины и обратная функция. Допустим, есть некая случайная величина, распределение которой задано функцией плотности f(x), имеющей следующий вид:

    плотность распределения случайной величины

    Это означает, что вероятность того, что значение данной случайной величины окажется в интервале (A, B), равняется площади затененной области. И как следствие, площадь всей закрашенной области должна равняться единице, так как в любом случае значение случайной величины попадет в область определения функции f.
    Функция распределения случайной величины является интегралом от функции плотности. И в данном случае ее примерный вид будет такой:

    функция распределения случайной величины

    Тут смысл в том, что значение случайной величины будет меньше чем A с вероятностью B. И как следствие, функция никогда не убывает, а ее значения лежат в отрезке [0, 1].

    Обратная функция — это функция, которая возвращает аргумент исходной функции, если в нее передать значение исходной функции. Например, для функции x2 обратной будет функция извлечения корня, для sin(x) это arcsin(x) и т.д.

    Так как большинство генераторов псевдослучайных чисел на выходе дают только равномерное распределение, то часто возникает необходимость его преобразования в какое-либо другое. В данном случае в нормальное Гауссовское:

    преобразование равномерного распределения в нормальное гауссовское

    Основу всех методов преобразования равномерного распределения в любое другое составляет метод обратного преобразования. Работает он следующим образом. Находится функция, обратная функции необходимого распределения, и в качестве аргумента передается в нее равномерно распределенная на отрезке (0, 1) случайная величина. На выходе получаем величину с требуемым распределением. Для наглядности привожу следующую картинку.

    метод обратного преобразования

    Таким образом, равномерный отрезок как бы размазывается в соответствии с новым распределением, проецируясь на другую ось через обратную функцию. Но проблема в том, что интеграл от плотности Гауссовского распределения вычисляется непросто, поэтому вышеперечисленным ученым пришлось схитрить.

    Существует распределение хи-квадрат (распределение Пирсона), которое представляет собой распределение суммы квадратов k независимых нормальных случайных величин. И в случае, когда k = 2, это распределение является экспоненциальным.

    экспоненциальное распределение случайной величины

    Это означает, что если у точки в прямоугольной системе координат будут случайные координаты X и Y, распределенные нормально, то после перевода этих координат в полярную систему (r, θ) квадрат радиуса (расстояния от начала координат до точки) будет распределен по экспоненциальному закону, так как квадрат радиуса — это сумма квадратов координат (по закону Пифагора). Плотность распределения таких точек на плоскости будет выглядеть следующим образом:

    нормальное гауссовское распределение на плоскостиметод бокса-мюллера

    Так как она равноценна во всех направлениях, угол θ будет иметь равномерное распределение в диапазоне от 0 до 2π. Справедливо и обратное: если задать точку в полярной системе координат с помощью двух независимых случайных величин (угла, распределенного равномерно, и радиуса, распределенного экспоненциально), то прямоугольные координаты этой точки будут являться независимыми нормальными случайными величинами. А экспоненциальное распределение из равномерного получить уже гораздо проще, с помощью того же метода обратного преобразования. В этом и заключается суть полярного метода Бокса-Мюллера.
    Теперь выведем формулы.

    полярный метод box-muller (1)

    Для получения r и θ нужно сгенерировать две равномерно распределенные на отрезке (0, 1) случайные величины (назовем их u и v), распределение одной из которых (допустим v) необходимо преобразовать в экспоненциальное для получения радиуса. Функция экспоненциального распределения выглядит следующим образом:

    функция распределения экспоненциального

    Обратная к ней функция:

    обратная функция экспоненциального распределения

    Так как равномерное распределение симметрично, то аналогично преобразование будет работать и с функцией

    нормальное в экспоненциальное

    Из формулы распределения хи-квадрат следует, что λ = 0,5. Подставим в эту функцию λ, v и получим квадрат радиуса, а затем и сам радиус:

    image

    Угол получим, растянув единичный отрезок до 2π:

    image

    Теперь подставим r и θ в формулы (1) и получим:

    box-muller метод бокса мюллера (2)

    Эти формулы уже готовы к использованию. X и Y будут независимы и распределены нормально с дисперсией 1 и математическим ожиданием 0. Чтобы получить распределение с другими характеристиками достаточно умножить результат функции на среднеквадратическое отклонение и прибавить математическое ожидание.
    Но есть возможность избавиться от тригонометрических функций, задав угол не прямо, а косвенно через прямоугольные координаты случайной точки в круге. Тогда через эти координаты можно будет вычислить длину радиус-вектора, а потом найти косинус и синус, поделив на нее x и y соответственно. Как и почему это работает?
    Выберем случайную точку из равномерно распределенных в круге единичного радиуса и обозначим квадрат длины радиус-вектора этой точки буквой s:

    равномерное распределение в круге

    Выбор осуществляется заданием случайных прямоугольных координат x и y, равномерно распределенных в интервале (-1, 1), и отбрасыванием точек, которые не принадлежат кругу, а также центральной точки, в которой угол радиус-вектора не определен. То есть должно выполниться условие 0 < s < 1. Тогда, как и в случае с Гауссовским распределением на плоскости, угол θ будет распределен равномерно. Это очевидно — количество точек в каждом направлении одинаково, значит каждый угол равновероятен. Но есть и менее очевидный факт — s тоже будет иметь равномерное распределение. Полученные s и θ будут независимы друг от друга. Поэтому мы можем воспользоваться значением s для получения экспоненциального распределения, не генерируя третью случайную величину. Подставим теперь s в формулы (2) вместо v, а вместо тригонометрических функций — их расчет делением координаты на длину радиус-вектора, которая в данном случае является корнем из s:

    marsaglia метод марсалья

    Получаем формулы, как в начале статьи. Недостаток этого метода — отбрасывание точек, не вошедших в круг. То есть использование только 78,5% сгенерированных случайных величин. На старых компьютерах отсутствие тригонометрических функций всё равно давало большое преимущество. Сейчас, когда одна команда процессора за мгновение вычисляет одновременно синус и косинус, думаю, эти методы могут еще посоревноваться.

    Лично у меня остается еще два вопроса:
    • Почему значение s распределено равномерно?
    • Почему сумма квадратов двух нормальных случайных величин распределена экспоненциально?

    Так как s — это квадрат радиуса (для простоты радиусом я называю длину радиус-вектора, задающего положение случайной точки), то сначала выясним, как распределены радиусы. Так как круг заполнен равномерно, очевидно, что количество точек с радиусом r пропорционально длине окружности радиуса r. А длина окружности пропорциональна радиусу. Значит плотность распределения радиусов возрастает равномерно от центра окружности к её краям. А функция плотности имеет вид f(x) = 2x на интервале (0, 1). Коэффициент 2 для того, чтобы площадь фигуры под графиком равнялась единице. При возведении такой плотности в квадрат, она превращается в равномерную. Так как теоретически в данном случае для этого необходимо функцию плотности разделить на производную от функции преобразования (то есть от x2). А наглядно это происходит так:

    возведение плотности в квадрат

    Если аналогичное преобразование сделать для нормальной случайной величины, то функция плотности ее квадрата окажется похожей на гиперболу. А сложение двух квадратов нормальных случайных величин уже гораздо более сложный процесс, связанный с двойным интегрированием. И то, что в результате получится экспоненциальное распределение, лично мне тут остаётся проверить практическим методом или принять как аксиому. А кому интересно, предлагаю ознакомиться с темой поближе, почерпнув знаний из этих книжек:
    • Вентцель Е.С. Теория вероятностей
    • Кнут Д.Э. Искусство Программирования, том 2


    В заключение приведу пример реализации генератора нормально распределенных случайных чисел на языке JavaScript:

    function Gauss() {
    	var ready = false;
    	var second = 0.0;
    	
    	this.next = function(mean, dev) {
    		mean = mean == undefined ? 0.0 : mean;
    		dev = dev == undefined ? 1.0 : dev;
    		
    		if (this.ready) {
    			this.ready = false;
    			return this.second * dev + mean;
    		}
    		else {
    			var u, v, s;
    			do {
    				u = 2.0 * Math.random() - 1.0;
    				v = 2.0 * Math.random() - 1.0;
    				s = u * u + v * v;
    			} while (s > 1.0 || s == 0.0);
    			
    			var r = Math.sqrt(-2.0 * Math.log(s) / s);
    			this.second = r * u;
    			this.ready = true;
    			return r * v * dev + mean;
    		}
    	};
    }
    
    g = new Gauss(); // создаём объект
    a = g.next(); // генерируем пару значений и получаем первое из них
    b = g.next(); // получаем второе
    c = g.next(); // снова генерируем пару значений и получаем первое из них
    

    Параметры mean (математическое ожидание) и dev (среднеквадратическое отклонение) не обязательны. Обращаю ваше внимание на то, что логарифм натуральный.
    Поделиться публикацией
    Комментарии 33
      +5
      Вы не сравнивали, насколько этот метод лучше часто используемой нормированной суммы 12 равномерно распределенных случайных величин?
        +2
        Интересно. А почему 12? Магическое число?

        Что-то мне подсказывает что это вы пытаетесь применить центральную предельную теорему. Тогда надо не 12 величин суммировать, а стремящееся к бесконечности число оных.
          +3
          К ЦПТ этот способ имеет непосредственное отношение. Для величин в интервале от 0 до 1 получается, что 12 действительно магическое число, потому что именно при 12-ти слагаемых дисперсия получается равной единице. Если сложить больше, само распределение получится точнее, но придётся находить способы для нормализации такого распределения и конечно же увеличивается сложность расчета.
            +1
            А можно ссылку на этот метод? Я не понимаю, как дисперсия при сложении 12 равномерно распределенных величин на [0..1] будет равна единице. По моим подсчетам дисперсия каждого слагаемого равна 0.25, соответственно дисперсия суммы будет 3.

            Да и нормализация дисперсии деле плевое же — всего лишь умножить на константу.
              0
              Это если один интервал растянуть (умножить на константу), то дисперсия пропорционально увеличится. А тут сложение нескольких случайных величин, сложный процесс, который изменяет плотность вероятностей. В статистике даже отдельное название получил — композиция законов распределений. Думаю вряд ли можно где-то встретить точную функцию плотности, которая получается при сложении 12 случайных величин. Я лично дисперсию проверил экспериментально.
                0
                Точную функцию плотности мы не встретим (хотя функцию распределения можно выписать в виде 12 вложенных интегралов), но вот дисперсию посчитать проще простого.

                Дисперсия суммы независимых величин равна сумме дисперсий.
                  +2
                  Для суммы 12 (и даже n) неависимых равномерно распределённых случайных величин существует распределение Ирвина-Холла.

                  P.S. Да, я понимаю, что опоздал с ответом на полгода, но, тем не менее, мне кажется, этот факт заслуживает упоминания.
                    –1
                    Что следует из Ирвина-Холла я не знаю.

                    Плотность распределения суммы из 12 равномерное распределенных нез. величин относится к классу нормального распределения? Не верю.

                    1. Я видел приложение(программу) где выполняли свёртку над одной и той же функцией. Она очень быстро сходится (визуально) к нормальному распределению.

                    2. Док-во цпд с которым я знаком: взяли суммы N случ. величин, плотность этой велчины есть свёртка плотностей отдельных. Накатили интегр-дифф. преобразование Фурье, свёртка превратилась в умножение. Неприятность — возникает кое-какой член ошибка.
                    2.1 Убрать его можно, но чтобы действовать строго придётся погемороится
                    2.2 Чтобы магия произошла для консервирования всё в Гауса нужно n->+inf. Возникнит распред. Гаусса (немного в другом виде нежели чем в Теории Вероятности, а именно exp(-pi*x*x))… А преобразование Фурье и обратное пр. Фурье от него есть тот же сигнал, это магия которая доказывается отдельно и она очень красивая. Накатывая теперь обратное интегр. дифф. преобразование Фурье на эту Функцию… Вы придёте к распределению Гаусса.
                    Здесь вы доказали цпд.

                    К сожалению, n->+inf нужно в шагах как 2.1, так и в 2.2 Я бы привел формулы, да latex-а нет.

                    Рассмотрение ЦПД при ограниченном n — очень затруднительно. Так что строго говоря, я не считаю это правильным методом из-за рассуждений (2), но я видел на практике (1) — оно быстро превращается в нечто похожее на Гауса.
                      0
                      Плотность распределения суммы из 12 равномерное распределенных нез. величин относится к классу нормального распределения? Не верю.
                      Это вообще к чему? Как бы слова «Ирвин-Холл» и «Нормальное» существенно различаются, я уже не говорю о формулах распределения. Ежу понятно, что сумма 12 стандартных равномерных случайных величин имеет конечный носитель и (в точности) нормальным быть не может.

                      Что такое ЦПД? Деорема?

                      Вообще, я не понял сути Вашего комментария. Я лично просто сказал, какое распределение будет у суммы n независимых равномерных случайных величин, а Вы мне тут (спустя полтора года после моего сообщения и 2 года с создания треда) каких-то простейших и нерелевантных фактов о нормальном распределении набросали. Это вообще что было и к чему?
                        0
                        Ну я как понял тут тредик — серия вопросо-ответов про сумму 12 независимых случайных величин.

                        Цель — разобраться с это штукой, мечтал всю жизнь.

                        Суть комментария — обсудить.

                        (1) я против такого приближения. (про 12 равн.распред. величин) с точки зрения функций распределения.
                        (2) поделился практикой про свёртку большого кол-ва функций.

                        «Ежу понятно, что сумма 12 стандартных равномерных случайных величин имеет конечный носитель и (в точности) нормальным быть не может.» — а что такое носитель и в точности"?

                        Я пишу когда угодно, почти что угодно. Для меня 2 года, и 20 лет — не стопер чтобы разобраться.
                          0
                          Носитель — это множество положительной плотности.
                          «В точности» означает именно то, что означает: никакие приближения не рассматриваются.

                          Я, собственно, идею суммы 12 равномерных величин не поддерживаю, поэтому со мной нечего обсуждать, а другие участники «тредика» не в курсе происходящего.
                            0
                            Спасибо. Меня друзья называют ежом.
                            Как я понимаю конечный носитель — это условие, что длина(мера) области определения где функция плотности распределения не нуль — конечна. Т.е. скалярный ряд из длин этих «отсровков» в области определения сходится.

                            Если взять такую функция из это класса и свернуть с самой собой, то будет функция из этого класса?

                            От себя:
                            Есть такой класс функций Compact Support f(x)=0: |x|>a; (Русского термин не знаю)
                            Этот класс функций вложен в ваш класс «с конечным носителем», если я правильно понимаю ваш класс.

                            С классом Compact Support думаю можно аккуратно показать, что
                            свёртка конечное кол-во раз таких функциЙ, если каждая из них ограничена, будет в этом классе.

                            Дополнение про изначальный комментарий:
                            Равномерное распределение (rect или uniform distribution) относятся к классу Compact Support.
                            Фишечка в том, что даже если вы возьмёте функции «с хвостиками», будет больно просто анализировать это поведение, как я писал очень уж важно иметь n такое большое, нужны эти предположения в док-ве цпт, о которых упомяналось в 2.1, 2.2. выше.

                            «со мной нечего обсуждать» — не проблема, я найду с кем обсудить, если у вас затруднения, ничего страшного. Есть другие форумы.
                              0
                              Да, свёртка двух функций с конечным носителем даст результатом функцию с конечным же (но уже чуть большим) носителем.

                              support — это и есть «носитель» по-русски (отсюда и обозначение в Вики). Компактность означает замкнутость и ограниченность (т.е. конечность, если мы говорим о числовой прямой).

                              Не совсем понимаю, о каких «хвостиках» идёт речь. Если Вы имеете в виду, что конечная сумма случайных величин с конечным носителем плохо приближает нормально распределённую случайную величину, то это не то, чтобы было сильно важно: у нормального распределения очень мало массы в хвостах (например, вероятность того, что стандартная нормальная случайная величина отклонится от ожидания всего на 7 (а носитель-то бесконечен, она может с некоторой вероятностью и на 10100 отклониться) уже составляет ничтожно малое значение 10­-12), поэтому для некоторых практических применений можно счесть, что плотность обнуляется после уклонения на некоторое a от мат. ожидания.
                                0
                                С support — ом вы правы, проверил в словаре
                                (http://www.multitran.ru/c/m.exe?a=110&t=1637986_1_2&sc=41)

                                (I) Если я буду плодить отрезки с длинами убывающими в геометрической прогрессии а между ними ставить пробелы, где функция ноль — то померенная длина области будет ограничена (просто из-за того что) геом. ряд сходится, но о никакой точке |x| после которого функция лежит в нуле речи не идёт. <<< Ведь это ваше определение конечного носителя «ограниченна длина области» определения или ограничена область определения как множество?

                                (II) С Compact support-ом я работал честно говоря работал на классе функций без точек разрыв второго рода.(которые разрыв «не шаг», а уводящие в бесконечность). Вообще про разрыв в определении ничего не сказано (http://mathworld.wolfram.com/CompactSupport.html)

                                Хвостики — умножьте функцию на (1-Rect(w)), с каким-то большим w и увидите хвостики,… Например w=10...) Я имею ввиду то что-то справа и слева лежат где-то там далеко..<< здесь не надо искать математической подоплёки...(я же не говорил, что это быстро убывающие функции)

                                Кстати, пример с Гаусином очень хорош — это быстроубывающая функция (Можно показать через Лапетале-Бернули), что убывает быстрее любого полинома....(Если интересно то такой класс функций называется в честь Француского математика Laurent Schwartz, которые его и предложил. Фурье Преобразование для функций из этого класса сущесвует и накатывая его вы снова остаётесь в этом классе)

                                На счёт оценки массы в хвостах спасибо.

                                Я на самом деле, что в док-во центральной предельной Теоремы КРАЕГОЛЬНОЙ кроме требования ограниченности мат. ожидания и дисперсии (которые на первый взгляд кажутся детскими), кроме всего прочего является факт того, что n->+inf сильно упрощает выкладки.

                                На счёт Ирвин-Холла спасибо, если есть ещё какое-то обощение, а не только класс U — буду рад узнать…
                                Численно это всего лишь свёртка плотностей распред. n раз, f*f*...f
                                Но если вам известна какая-та аналитическая модель которая приближает эту свёртку.

                                p.s. Только не обижайтесь — википедия не очень хороший источник знаний, лучше или wolfram или большая советская энциклопедия. Последнюю составляли академики, а википедию — делиданты.

                                Как программист, я правил что-то на русской вики, потом мне это просто надоело по алгоритмам фундаментальным. Как первое приближение конечно она остаётся норм.
                  +2
                  Дисперсия для равномерного на [0..1) распределения равна именно что 1/12

                  Так что дисперсия суммы 12 величин будет близка к 1
                    0
                    Спасибо, теперь все понятно, я почему-то дисперсию одного слагаемого неправильно посчитал.
                0
                бесконечное количество величин складывать очень долго, а 12, вероятно, дают достаточно хорошее приближение.
                  +1
                  У вас тег sarcasm отклеился

                  Безусловно. Просто если есть точная формула, то зачем пользоваться приближением?
                  +1
                  Тут цель сгенерировать число image, cooтвeтcтвeннo в oбщeм cлучae нaм нужнo

                  image

                  B дaннoм cлучae мы пpocтo выбpaли N=12 чтoбы упpocтить кopeнь cлeвa, и coтвeтcтвeннo дoлжны вычecть 6.
                    0
                    А откуда эта формула? Я вот ума не приложу откуда берется 12.

                    Я вот пытаюсь её вывести и получается только такое:


                    Потому что дисперсия суммы будет N и чтобы нормировать её до единицы нужно разделить на sqrt(N)

                    P.S. — Так, тут я похоже фигню написал, но двух минут на исправление комментария не хватит
                  +1
                  Наверно стоило упомянуть его в статье. Дисперсия у них одинаковая, но форма функции плотности немного отличается. И в отличие от суммы 12 равномерно распределенных случайных величин этот метод абсолютно точный. А лучше или хуже, и насколько критична точность, зависит от конкретной задачи и вычислительных средств. Грубо говоря, если случайное число генерируется подбрасыванием монетки, то очевидно преимущество метода полярных координат. Для каких-то задач, возможно, будет преимуществом то, что при суммировании 12 равномерных величин итоговый результат будет в ограниченном промежутке и, например, не вылезет за границы массива. По скорости вычисления в JavaScript, например, эти методы примерно одинаковы, скорость больше колеблется от способа реализации алгоритма, чем от выбора метода.
                  0
                  Суть в том, что e-x2 не интегрируется, а x*e-x2 — интегрируется за счет подстановки y=x2. В общем случае, использование n-мерного пространства позволяет свести генерацию случайной величины с четной плотностью распределения f(x) к генерации случайной величины с плотностью распределения xn-1*f(x). В частности, если f(x)=g(xn), то можно сделать подстановку y=xn и перейти к случайной величине с плотностью g(y).
                    –5
                    Если нет времени заморачиваться, а равномерное распределение категорически не подходит, можно просто написать в коде rand() — rand()
                      0
                      Разве не так быть должно?
                        0
                        Есть и такой способ, но функция InverseErf далеко не везде реализована, и еще не известно как быстро она работает в вашем примере
                          0
                          Эта функция довольно просто разлагается в ряд тейлора.
                          Плюс, имхо, более прямо показывает как получать любое распределение из равномерного распределения:
                            +2
                            Но этот ряд тейлора не будет вычисляться на аппаратном уровне, в отличие от таких функций как корень или логарифм.
                            А как получить любое распределение, в статье описано.
                        +1
                        Хоть s и является функцией от x и y, от каждой из этих координат в отдельности s будет независима.


                        Поосторожнее с такими выказываниями :) Очевидно s зависима и от каждой координаты по отдельности. Например распределение величины s при условии что x=1 будет сосредоточено в единственной точке s=1.

                        Вот что можно утверждать, так это то что полученные из пары (x, y) величины (s, theta) будут независимы друг от друга (а не от x и y). А следовательно и sin(theta) и cos(theta) будут независимы от s. И тогда уже можно в итоговой формуле использовать s повторно.
                          0
                          Точно. Спасибо, поправил.
                          +1
                          Сейчас, когда одна команда процессора за мгновение вычисляет одновременно синус и косинус, думаю, эти методы могут еще посоревноваться.

                          Об эффективности вычисления стоит поговорить, здесь очень интересный момент вырисовывается.

                          Смотрите: алгоритм Бокса-Мюллера выдает сразу два нормально распределенных значения, независимых друг от друга. Привычно же, что генератор случайных чисел поставляет их по штуке за раз, и нужны случайные числа, как правило, поштучно. А тут второе число на халяву образуется. Что можно сделать:

                          • вернуть из функции сразу пару значений — это переложить головную боль на потребителя
                          • выбросить второе значение — наверное, жалко. Оно хорошее, и тяжело досталось: там логарифм или тригонометрия в расчетах
                          • сохранить второе значение глобально, вернуть при следующем вызове — нехорошо, мы ж модные функциональные пацаны с параллелизмом, без блокировок и побочных эффектов, не надо нам ничего глобального

                          Самое приятное — сохранить второе значение на стеке, запомнить новую точку входа. Поэтому алгоритм Бокса-Мюллера — очень неплохая иллюстрация к coroutines. Например, на Питоне:

                          def randnorm():
                              while True:
                                  x = 2 * math.pi * random.random()
                                  y = math.sqrt(-2 * math.log(random.random()))
                                  yield math.cos(x) * y
                                  yield math.sin(x) * y
                          


                          Но это в теории. Когда я писал «промышленный» перловый модуль (вот он: Math::Random::NormalDistribution), я, разумеется, не поленился написать пачечку бенчмарок, где проверил разнообразные комбинации: вычисление через тригонометрические функции, вычисление через логарифм с отбрасыванием значений, не попадающих в единичный круг; в виде обычных функций (с отбрасыванием второго значения), в виде замыканий (с использованием ранее вычисленного значения), в виде генераторов, возвращающих замыкание и т.п.

                          Самым быстрым (по крайней мере для Перла) оказалось самое лобовое решение: не возиться с короутинами, не сводить к более быстрому логарифму, а просто вычислить косинус/синус, второе значение отбросить.

                          А эти ваши yield'ы — баловство, дороже обходятся :)
                            0
                            Полезная статья! Не могли бы вы привести формулу для одномерного случая? У меня по тестам никак не получается выйти на единичную дисперсию.
                              +1
                              Возможно, вы что-то не поняли или я вас не понял, но в статье как раз объясняется то, почему проще получить сразу две величины. И эти две величины будут одномерными и независимыми друг от друга. Вторую можно вообще выбросить, если это не ухудшит производительность, результат не изменится. То есть искать только Z0. А чтобы получить одну нормальную величину из одной равномерной, то придется исользовать нестандартную функцию, обратную функции erf, как писали выше уже. Покажите ваш тест.
                                0
                                Это я не так поняла, поправила у себя расчет. Теперь дисперсия и мат ожидание примерно 1 и 0, как положено. Спасибо большое. Тестировала пока просто в excel, чтобы побыстрому проверить расчеты и взглянуть на график.

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                            Самое читаемое