Ваш общий вопрос слишком широкий, он может (и может) заполнить весь учебник .
Тем не менее, очень быстрый обзор заключается в том, что методы для генерации неединообразные случайные числа попадают в несколько общих категорий.К ним относятся:
- Обратное преобразование кумулятивной функции распределения (CDF);
- Свертка (суммы случайных величин сами по себе являются случайными переменными с другим распределением);
- Композиция (разложение сложного распределения на более простые части с использованием условной вероятности);
- Методы принятия / отклонения (генерировать случайные «догадки», отклонять и повторять, если нарушены ограничения целевого распределения);и
- «Особые отношения» (признавая, что некоторые распределения имеют тесную связь с другими, которые легче генерировать).
Простой пример каждого из 1-3 и 5можно найти в разделе 4.3 этого учебного документа .
На практике часто используется комбинация методов.
Например, нормальное распределение не может быть найдено аналитически путем инверсии, потому что для этого потребуется возможность написать уравнение в замкнутой форме для CDF.
Два популярных варианта генерации нормалей смотрят на пары нормалей в полярных координатах, т. Е. Выражают как направление и расстояние.Базовый алгоритм Бокса-Мюллера отмечает, что направление равномерно от 0 до 2π, и Пифагор говорит нам, что расстояние основано на сумме квадратов нормалей, которая имеет распределение хи-квадрат (2) (свертка).«Специальные отношения» говорят нам, что хи-квадрат (2) - это экспонента (2), которую легко получить с помощью инверсии.Сведение всех частей вместе и преобразование обратно в декартовы координаты дает пару формул, найденных в статье в Википедии.
Второй вариант - Полярный метод Марсальи , который выглядит как метод, используемый NumPy .Это позволяет избежать оценки трансцендентных функций синуса / косинуса, генерируя точки случайным образом в квадрате и отбрасывая любые, которые не содержатся внутри ограниченного круга (принятие / отклонение).Затем он масштабирует результаты с использованием того же вычисления хи-квадрат / экспоненциального расстояния, поэтому он также использует свертку, «особые отношения» и инверсию.
Самые быстрые подходы основаны на алгоритме ziggurat , который разбивает нормаль на слои (состав), использует специальные отношения для некоторых слоев и использует принятие / отклонение для обработки хвостов слоя.