математика — математика, лежащая в основе default_random_engine и normal_distribution в переполнении стека

Может кто-нибудь привести меня туда, где на самом деле говорится о математике, которая лежит в основе этих двух normal_distribution и default_random_engine. Из того, что я понимаю, использует твистер Мерсенна? Если так, то кто-нибудь может направить меня в сторону какого-то онлайн-ресурса, который объясняет, как на самом деле работает этот псевдослучайный алгоритм, если это то, что он использует, потому что я не могу найти много о мерсенном твистере. Кроме того, если число является равномерным, что выводит большинство псевдослучайных алгоритмов, то как нормальное_распределение делает его нормально распределенным? Использует ли он обратное преобразование, Box Muller или Ziggurat? Любая помощь, я был бы очень признателен 🙂

2

Решение

Есть несколько вопросов, о которых вы спрашиваете. Первый касается методов генерации последовательности псевдослучайных чисел, обычно целых чисел. В Википедии есть разумное описание Мерсенн Твистер (MT), а также Линейный конгруэнтный генератор (LCG) оба из которых выполняют эту функцию. Они предназначены для более или менее равномерного распределения целых чисел по всему эффективному диапазону и представляют основные функциональные возможности, необходимые для создания более сложных распределений.

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

  1. Выборка обратного преобразования — Если обратная сторона CDF распределения имеет замкнутую форму, ничья из U (0,1) может использоваться для генерации ничьих из базового PDF.
  2. Тождества — Некоторые дистрибутивы могут быть сгенерированы с использованием идентификаторов других дистрибутивов. нормальное распределение попадает в эту категорию, так как не существует замкнутой формы его обратной CDF. Есть несколько методов который может быть использован для генерации розыгрышей из стандартных нормальных распределений.
  3. Определяемое пользователем распределение — Если нет закрытой формы или нет подходящих идентификаторов, доступных для создания переменных, разработчик может приблизить PDF, взяв образцы и создав гистограмму PDF. Затем это может быть использовано для построения аппроксимации CDF и его инверсии, из которой можно сделать розыгрыши.
  4. Отбор проб — Этот метод генерирует изменения из PDF-файла, отклоняя рисунки из другого PDF-файла, которые не соответствуют свойствам требуемого PDF-файла.

Если вы ищете конкретные подробности реализации библиотек классов C ++ для Mersenne Twister, вы можете посмотреть на Повысьте исходный код что даст некоторое представление о том, как Boost это делает. AFAIK, стандарт C ++ 11 не определяет, как это должно быть реализовано, только как он должен вести себя. Реализация оставлена ​​на усмотрение разработчиков компилятора, но я был бы удивлен, если бы многие из наиболее распространенных компиляторов использовали что-то кроме реализации Boost (обновление: хотя приведенное ниже наблюдение MSalters является одной из причин, по которой конкретный компилятор будет делать что-то еще). То же самое относится и к Увеличить класс нормального распределения.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]