Полярный метод Марсальи - Marsaglia polar method
В Марсалья полярный метод[1] это выборка псевдослучайных чисел метод генерации пары независимых стандартные нормальные случайные величины.[2] Хотя он превосходит Преобразование Бокса – Мюллера,[3] в Алгоритм зиккурата еще эффективнее.[4]
Стандартные нормальные случайные величины часто используются в Информатика, вычислительная статистика, и, в частности, в приложениях Метод Монте-Карло.
Полярный метод работает путем выбора случайных точек (Икс, у) в квадрате −1 <Икс < 1, −1 < у <1 до
а затем возвращая требуемую пару нормальных случайные переменные в качестве
или, что то же самое,
куда и представляют косинус и синус угла, на который вектор (Икс, у) делает с Икс ось.
Теоретические основы
Основную теорию можно резюмировать следующим образом:
Если ты равномерно распределена в интервале 0 ≤ты <1, то точка (cos (2πты), sin (2πты)) равномерно распределена по единичной окружностиИкс2 + у2 = 1, и умножив эту точку на независимую случайную переменную ρ с распределением
поставит точку
координаты которых совместно распределены как две независимые стандартные нормальные случайные величины.
История
Эта идея восходит к Лаплас, кому Гаусс кредиты с обнаружением выше
извлекая квадратный корень из
Преобразование в полярные координаты показывает, что θ равномерно распределен (постоянная плотность) от 0 до 2π и что радиальное расстояние р имеет плотность
(р2 имеет соответствующий чи квадрат распределение.)
Этот метод создания пары независимых стандартных нормальных переменных путем радиального проецирования случайной точки на единичной окружности на расстояние, задаваемое квадратным корнем из переменной хи-квадрат-2, называется полярным методом генерации пары нормальных случайных величин. ,
Практические соображения
Прямое применение этой идеи,
называется Преобразование Бокса – Мюллера, в котором вариация ци обычно генерируется как
но это преобразование требует функций логарифма, квадратного корня, синуса и косинуса. На некоторых процессорах косинус и синус одного и того же аргумента могут быть вычислены параллельно с помощью одной инструкции.[5] В частности, для машин на базе Intel можно использовать инструкцию ассемблера fsincos или инструкцию expi (доступную, например, в D) для вычисления сложных
и просто разделите реальную и мнимую части.
Примечание: Чтобы явно вычислить комплексно-полярную форму, используйте следующие подстановки в общем виде:
Позволять и потом
Напротив, полярный метод здесь устраняет необходимость в вычислении косинуса и синуса. Вместо этого, решая точку на единичной окружности, эти две функции можно заменить на Икс и у координаты нормированные на радиус. В частности, случайная точка (Икс, у) внутри единичной окружности проецируется на единичную окружность, задав и формируя точку
что является более быстрой процедурой, чем вычисление косинуса и синуса. Некоторые исследователи утверждают, что условная инструкция if (для отклонения точки за пределами единичного круга) может замедлить выполнение программ на современных процессорах, оснащенных конвейерной обработкой и предсказанием ветвлений.[6] Также эта процедура требует примерно на 27% больше оценок основного генератора случайных чисел (только генерируемых точек лежат внутри единичной окружности).
Затем эта случайная точка на окружности проецируется в радиальном направлении на необходимое случайное расстояние с помощью
используя тот же s потому что s не зависит от случайной точки на окружности и равномерно распределен от 0 до 1.
Выполнение
Простая реализация в Ява используя среднее значение и стандартное отклонение:
частный статический двойной запасной;частный статический логический hasSpare = ложный;общественный статический синхронизированный двойной генерироватьГауссовский(двойной иметь в виду, двойной stdDev) { если (hasSpare) { hasSpare = ложный; возвращаться запасной * stdDev + иметь в виду; } еще { двойной ты, v, s; делать { ты = Математика.случайный() * 2 - 1; v = Математика.случайный() * 2 - 1; s = ты * ты + v * v; } пока (s >= 1 || s == 0); s = Математика.sqrt(-2.0 * Математика.бревно(s) / s); запасной = v * s; hasSpare = истинный; возвращаться иметь в виду + stdDev * ты * s; }}
Не-потокобезопасный реализация в C ++ используя среднее значение и стандартное отклонение:
двойной генерироватьГауссовский(двойной иметь в виду, двойной stdDev) { статический двойной запасной; статический bool hasSpare = ложный; если (hasSpare) { hasSpare = ложный; возвращаться запасной * stdDev + иметь в виду; } еще { двойной ты, v, s; делать { ты = (ранд() / ((двойной)RAND_MAX)) * 2.0 - 1.0; v = (ранд() / ((двойной)RAND_MAX)) * 2.0 - 1.0; s = ты * ты + v * v; } пока (s >= 1.0 || s == 0.0); s = sqrt(-2.0 * бревно(s) / s); запасной = v * s; hasSpare = истинный; возвращаться иметь в виду + stdDev * ты * s; }}
C ++ 11 GNU GCC libstdc ++ реализация std :: normal_distribution использует полярный метод Марсальи, как указано в здесь.
Рекомендации
- ^ Marsaglia, G .; Брей, Т.А. (1964). «Удобный метод генерации нормальных переменных». SIAM Обзор. 6 (3): 260–264. Дои:10.1137/1006063. JSTOR 2027592.
- ^ Питер Э. Клоден Экхард Платен Анри Шурц, Численное решение SDE с помощью компьютерных экспериментов, Springer, 1994.
- ^ Глассерман, Пол (2004), Методы Монте-Карло в финансовом инжиниринге, Приложения математики: стохастическое моделирование и прикладная вероятность, 53, Springer, стр. 66, ISBN 9780387004518.
- ^ Томас, Дэвид Б .; Лук, Уэйн; Leong, Philip H.W .; Вилласенор, Джон Д. (2007). «Генераторы гауссовских случайных чисел». Опросы ACM Computing. 39 (4): 11 – es. CiteSeerX 10.1.1.127.5773. Дои:10.1145/1287620.1287622.
- ^ Кантер, Дэвид. «Графическая архитектура Intel Ivy Bridge». Технология реального мира. Получено 8 апреля 2013.
- ^ Этот эффект может быть усилен в графическом процессоре, генерирующем несколько вариаций параллельно, где отказ одного процессора может замедлить работу многих других процессоров. См. Раздел 7 Томас, Дэвид Б .; Howes, Lee W .; Luk, Wayne (2009), «Сравнение процессоров, графических процессоров, FPGA и массивов массивов параллельных процессоров для генерации случайных чисел», в Chow, Paul; Чунг, Питер Ю. К. (ред.), Материалы 17-го Международного симпозиума ACM / SIGDA по программируемым вентильным массивам, FPGA, 2009 г., Монтерей, Калифорния, США, 22–24 февраля 2009 г., Ассоциация вычислительной техники, стр. 63–72, CiteSeerX 10.1.1.149.6066, Дои:10.1145/1508128.1508139, ISBN 9781605584102.