Что такое генератор нормального распределения

Генератор нормально распределенной случайной величины в заданном диапазоне C++ Решение и ответ на вопрос 864095

Что такое генератор нормального распределения

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

Здравствуйте, некоторое время назад я создавал тему с вопросом о том как сгенерировать случайные числа в диапазоне от Ν до M, Z число раз. Тогда мне посоветовали следующий код

Но в последствии я понял, что генерируется не нормально распределенная величина (также называемое распределением Гаусса), а равномерно распределенная величина (а может я ошибаюсь. ). Подскажите генератор случайной величины которая распределена нормально (по Гауссу), и так чтобы генерировались случайные числа в диапазоне от Ν до M, Z число раз.

Добавлено через 23 часа 55 минут
Подскажите пожалуйста, срочно нужно.. совсем застопорился.

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Смоделировать алгоритм непрерывной случайной величины распределенной с плотностью
Прошу помощи, так как не могу выполнить данное задание. Делал на матлабе, но преподавателю это не.

N(10,2). Найти вероятность того, что в испытаниях Х примет значения больше 8 и.

Заданы математическое ожидание а и с.к.о. σ нормально распределенной случайной величины Х
Заданы математическое ожидание а и среднее квадратическое отклонение σ нормально.

Вычислить вероятность попадания нормально распределённой случайной величины в интервал
Помогите пожалуйста решить задачу оч нужно. Св х распределена нормально с математическим ожиданием.

Добавлено через 1 минуту
NikWhite, ваще тут при больших значениях фигня будет

Добавлено через 1 минуту
NikWhite, если числа маленькие, то юзайте

Добавлено через 41 секунду
NikWhite, randMAX просто слишком маленький

Пробовал бокса-мюллера,но он жутко медленный (зависал даже на 10 значениях), совсем не подходит. решил использовать центральную предельную теорему

Попытался сделать, чтобы это работало в конкретном диапазоне (от 200 до 300), но не получилось, попадаются числа выпадающие из этого диапазона.

Добавлено через 13 минут

Я могу генерировать случайною величину в заданном диапазоне, она получится равномерно распределенной на этом промежутке, а потом с помощью центральной предельной теоремы перейду к нормально распределенной.

И еще Χ принадлежит [-∞;+∞], теоретически есть промежутки.

Добавлено через 2 часа 30 минут

Добавлено через 1 минуту
NikWhite, ваще тут при больших значениях фигня будет

Добавлено через 1 минуту
NikWhite, если числа маленькие, то юзайте

Добавлено через 41 секунду
NikWhite, randMAX просто слишком маленький

Сумма равномерных случайных величин сходится к нормальному распределению достаточно быстро, и практика показала, что уже при n > 10 сходимость хорошая.
Однако непосредственно пользоваться приведенными соотношениями нельзя из-за зависимости параметров распределения Y от числа слагаемых и жесткой связи между my и σ2y. Поэтому для нормальных случайных величин с заданными параметрами my и σy используется следующая двухэтапная процедура, основанная на устойчивости нормального распределения к линейному преобразованию.
В начале формируется последовательность чисел , подчиненных нормированному нормальному распределению (т.е.нормальному распределению с параметрами mz = 0; σz=1). Для этого выполняется операция

Как нетрудно видеть, mz = 0; σz=1.
Затем последовательность преобразуется в требуемую последовательность
по формуле

Следует обратить внимание, что для получения одного числа последовательности надо использовать 12 равномерных чисел.
Программа, реализующая описанную процедуру, в отличие от датчика равномерных чисел, может не содержаться в математическом обеспечении компьютера.

Не знаю снят ли до конца вопрос, но может кому пригодится. Так же прошу прощения за «много букв» но может кому будет интересно.

Тут нужно понимать что у нормального распределения есть такая характеристика как СКО(СреднеКвадратичное Отклонение) попробую объяснить на примере, что оно означает:
Например у нас есть выборка из 1000 значений (нормально распределенная) и например СКО (или сигма) = 30 означает, что 67% всех значений меньше либо равны 30.
Так же есть правило 2х сигм, говорящее о том что в диапазоне 2х сигм лежит 95% значений, и правило 3х сигм, говорящее о том, что 99,7% значений лежит в диапазоне 3х сигм.
Теперь на нашем примере:
67% (СКО, сигма) значений лежат в диапазоне от [-30, 30]
95% (2 сигма) значений лежат в диапазоне от [-60, 60] (30*2 = 60)
99,7% (3 сигма) значений лежат в диапазоне от [-90, 90] (30*3 = 90)

Теперь вернемся к твоей задаче, тебе нужны числа от M до N, не очень удачное обозначение, т.к. М обычно обозначается математическое ожидание(среднее значение), поэтому перефомулируем, так: нужны числа в диапазоне от N1 до N2, получаем:
M (мат. ожидание) = (N2+N1) / 2 (это просто среднее значение, от которого может колебатся ошибка)
3 сигма = M-N1, т.е. M-N1 это максимальное значение которое может принимать ошибка, и говоря о 3 сигма, мы говорим, что мы хотим такую выборку, 99,7% которой не больше M-N1
соответственно СКО (сигма) = 3 сигма / 3 = (M-N1)/3 это то значение с которым ты должен использовать генератор нормальных чисел, чтобы генерируемые значения не выходили из твоего диапазона.

Далее сам генератор:

Цифра «28» и «2.11233» получены эмпирическим путем (читай методом научного тыка), значения были подобраны таким образом, что бы сигме соответствовало 67% значений, 2ум сигмам 95% значений, ну и 3м сигмам 99,7% значений (другие подобные функции редко проходят подобную проверку). Так же было проверено следующее: если сгенерировать 2е случайные, нормально распределенные величины и их сложить, то СКО этой величины должно быть равно qsrt(2)*сигма, моя функция проходит эту проверку.

Результат работы генератора:
Генерировалось 10.000.000 значений с СКО = 0.3, потом вычислялась статистика полученной выборки, результат:
67% = 0.299913049 | 95% = 0.600402057 | 99.7% = 0.900952756
67% = 0.300060332 | 95% = 0.600611031 | 99.7% = 0.901350796
67% = 0.299943686 | 95% = 0.600414336 | 99.7% = 0.900437713
67% = 0.300084651 | 95% = 0.60008353 | 99.7% = 0.901191831
67% = 0.299931049 | 95% = 0.599887371 | 99.7% = 0.90083015
67% = 0.299906909 | 95% = 0.600438833 | 99.7% = 0.901222467
67% = 0.300041765 | 95% = 0.600383639 | 99.7% = 0.900027037
67% = 0.300010741 | 95% = 0.60065949 | 99.7% = 0.900523663
67% = 0.299839497 | 95% = 0.600499749 | 99.7% = 0.900946617
67% = 0.300182939 | 95% = 0.600420237 | 99.7% = 0.901810706
Среднее СКО = 0.299977

Ошибка генератора 0.0077% ничтожно малое значение.

Ну и пример использования:
Например, функция для решения твоей задачи будет иметь следующий вид (сохраняя твои обозначения):

С уважением Алексей

Добавлено через 1 час 26 минут

Документация

Нормальные случайные числа

Синтаксис

Описание

r = normrnd( mu , sigma ) генерирует случайное число от нормального распределения средним параметром mu и параметр стандартного отклонения sigma .

r = normrnd( mu , sigma , sz1. szN ) генерирует массив нормальных случайных чисел, где sz1. szN указывает на размер каждой размерности.

r = normrnd( mu , sigma , sz ) генерирует массив нормальных случайных чисел, где векторный sz задает size(r) .

Примеры

Сгенерируйте нормальное случайное число

Сгенерируйте одно случайное значение от стандартного нормального распределения.

Сброс генератора случайных чисел

Сохраните текущее состояние генератора случайных чисел. Затем создайте вектор 1 на 5 из нормальных случайных чисел от нормального распределения со средним значением 3 и стандартное отклонение 10.

Восстановите состояние генератора случайных чисел к s , и затем создайте новый вектор 1 на 5 из случайных чисел. Значения те же, что и прежде.

Клонирование размера от существующего массива

Создайте матрицу нормально распределенных случайных чисел с тем же размером как существующий массив.

Можно объединить предыдущие две строки кода в одну строку.

Входные параметры

mu среднее значение
скалярное значение | массив скалярных значений

Среднее значение нормального распределения в виде скалярного значения или массива скалярных значений.

Чтобы сгенерировать случайные числа от нескольких распределений, задайте mu и sigma использование массивов. Если оба mu и sigma массивы, затем размеры массивов должны быть тем же самым. Если любой mu или sigma скаляр, затем normrnd расширяет скалярный аргумент в постоянный массив одного размера с другим аргументом. Каждый элемент в r случайное число, сгенерированное от распределения, заданного соответствующими элементами в mu и sigma .

Пример: [0 1 2; 0 1 2]

Типы данных: single | double

sigma Стандартное отклонение
неотрицательное скалярное значение | массив неотрицательных скалярных значений

Стандартное отклонение нормального распределения в виде неотрицательного скалярного значения или массива неотрицательных скалярных значений.

Если sigma нуль, затем выход r всегда равно mu .

Чтобы сгенерировать случайные числа от нескольких распределений, задайте mu и sigma использование массивов. Если оба mu и sigma массивы, затем размеры массивов должны быть тем же самым. Если любой mu или sigma скаляр, затем normrnd расширяет скалярный аргумент в постоянный массив одного размера с другим аргументом. Каждый элемент в r случайное число, сгенерированное от распределения, заданного соответствующими элементами в mu и sigma .

Пример: [1 1 1; 2 2 2]

Типы данных: single | double

sz1. szN — Размер каждой размерности (в качестве отдельных аргументов)
целые числа

Размер каждой размерности в виде целых чисел. Например, определение 5,3,2 генерирует 5 3 2 массивами случайных чисел от вероятностного распределения.

Если любой mu или sigma массив, затем заданные измерения sz1. szN должен совпадать с общими размерностями mu и sigma после любого необходимого скалярного расширения. Значения по умолчанию sz1. szN общие размерности.

Если вы задаете одно значение sz1 , затем r квадратная матрица размера sz1 — sz1 .

Если размером какой-либо размерности является 0 или отрицательный, затем r пустой массив.

После второго измерения, normrnd игнорирует последующие измерения с размером 1. Например, определение 3,1,1,1 дает вектор 3 на 1 случайных чисел.

Читайте также  Устройство генератора зил 5301

Пример: 5,3,2

Типы данных: single | double

sz — Размер каждой размерности (как вектор-строка)
вектор-строка из целых чисел

Размер каждой размерности в виде вектора-строки из целых чисел. Например, определение [5,3,2] генерирует 5 3 2 массивами случайных чисел от вероятностного распределения.

Если любой mu или sigma массив, затем заданные измерения sz должен совпадать с общими размерностями mu и sigma после любого необходимого скалярного расширения. Значения по умолчанию sz общие размерности.

Если вы задаете одно значение [sz1] , затем r квадратная матрица размера sz1 — sz1 .

Если размером какой-либо размерности является 0 или отрицательный, затем r пустой массив.

После второго измерения, normrnd игнорирует последующие измерения с размером 1. Например, определение [3,1,1,1] дает вектор 3 на 1 случайных чисел.

Пример: [5,3,2]

Типы данных: single | double

Выходные аргументы

r — Нормальные случайные числа
скалярное значение | массив скалярных значений

Нормальные случайные числа, возвращенные как скалярное значение или массив скалярных значений с размерностями, заданными sz1. szN или sz . Каждый элемент в r случайное число, сгенерированное от распределения, заданного соответствующими элементами в mu и sigma .

Альтернативная функциональность

normrnd функционально-специализированное к нормальному распределению. Statistics and Machine Learning Toolbox™ также предлагает родовую функцию random , который поддерживает различные вероятностные распределения. Использовать random , создайте NormalDistribution объект вероятностного распределения и передача объект как входной параметр или задают имя вероятностного распределения и его параметры. Обратите внимание на то, что специфичная для распределения функция normrnd быстрее, чем родовая функция random .

Использование randn сгенерировать случайные числа от стандартного нормального распределения.

Чтобы сгенерировать случайные числа в интерактивном режиме, использовать randtool , пользовательский интерфейс для генерации случайных чисел.

Ссылки

[1] Marsaglia, G, и В. В. Цанг. “Быстрый, Легко Реализованный метод для Выборки от Уменьшения или Симметричных Одномодовых Функций плотности”. SIAM Journal на Научном и Статистическом Вычислении. Издание 5, Номер 2, 1984, стр 349–359.

[2] Эванс, M., Н. Гастингс и Б. Пикок. Статистические Распределения. 2-й редактор Хобокен, NJ: John Wiley & Sons, Inc., 1993.

Расширенные возможности

Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.

Указания и ограничения по применению:

Сгенерированный код может возвратить различную последовательность чисел, чем MATLAB ® , если любое из следующего верно:

Выход является нескалярным.

Входной параметр недопустим для распределения.

Для получения дополнительной информации о генерации кода смотрите Введение в Генерацию кода и Общий Рабочий процесс Генерации кода.

Массивы графического процессора
Ускорьте код путем работы графического процессора (GPU) с помощью Parallel Computing Toolbox™.

Эта функция полностью поддерживает массивы графического процессора. Для получения дополнительной информации смотрите функции MATLAB Запуска на графическом процессоре (Parallel Computing Toolbox) .

Смотрите также

  • Генерация случайных чисел
  • Нормальное распределение

Открытый пример

У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?

Документация Statistics and Machine Learning Toolbox

  • Примеры
  • Функции и другая ссылка
  • Информация о релизах
  • PDF-документация

Поддержка

  • MATLAB Answers
  • Помощь в установке
  • Отчеты об ошибках
  • Требования к продукту
  • Загрузка программного обеспечения

© 1994-2021 The MathWorks, Inc.

1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.

2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.

3. Сохраняйте структуру оригинального текста — например, не разбивайте одно предложение на два.

4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.

5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.

Генерирование на ЭВМ последовательностей равномерно распределенных случайных чисел. Моделирование нормально распределенной случайной величины

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

В настоящее время все языки высокого уровня имеют программные генераторы равномерно распределенных последовательностей псевдослучайных чисел. Их называют датчиками случайных чисел. Датчики случайных чисел, как правило имеют имена: RAN, RAND, RANDU, RND , RANDOM, RANDOMIZE и т.д. Эти имена получены от английского слова random , означающего случайный или выбранный наугад. Поэтому датчики случайных чисел иногда называют рандомизаторами.

Датчики случайных чисел обычно генерируют последовательность действительных чисел Un , равномерно распределенных между нулем и единицей, т.е. последовательность случайных дробей в интервале [0,1] . Но вначале датчики генерируют последовательность целых случайных чисел xi в интервале от нуля до m, где m – размер машинного слова (на единицу меньше максимального целого числа, размещающегося в машинном слове).

Как уже говорилось, для 32-х разрядного машинного слова:

m = 2 31 = 2147483648;

1/m = 0.4656613 E-9 .

Приведем датчик равномерно распределенных случайных чисел RANDU.

Этот датчик специально предназначен для системы IBM и образует 2 29 значений перед началом повторений, т.е. длина цикла равна 2 29 (при 32-х разрядном машинном слове). Алгоритм датчика реализует метод остатка степеней (рис. 8.1).

Назначение датчика RANDU :

Вычисление равномерно распределенных случайных действительных чисел YF в интервале [0,1] и случайных целых чисел IY в интервале [0,2 31 ] . В качестве входа служит целое случайное число IX , на выходе образуется новое целое число IY и вещественное YF .

Обращение к датчику:

IX – при первом обращении – нечетное целое число с числом цифр .

После первого обращения IX=IY , где IY – целое число , вычисленное при предыдущем обращении.

IY – полученное в результате целое случайное число, требуемое при последующих обращениях. IY находится в интервале [0, 2 31 ] .

YF – полученное в результате равномерно распределенное действительное число в интервале [0,1] , представленное в форме с плавающей запятой.

Используя датчик RANDU , построим алгоритм вычисления последовательности равномерно распределенных случайных чисел и ее печать (рис. 8.2).

Алгоритм вычисления последовательности равномерно распределенных случайных чисел.

N — длина последовательности (количество испытаний).

IX — начальное значение , нечетное целое число с числом цифр .

Например: IX = 1234567 .

Различные начальные значения параметра IX позволяют формировать различные последовательности равномерно распределенных псевдослучайных чисел.

Для генерирования равномерно распределенных случайных чисел на отрезке [0,1] используется отделение дробной части от сложного арифметического выражения, содержащего предшествующее число.

FRAC – оператор выделения дробной части,

Vi — предшествующее случайное число,

Vi+1 — последующее случайное число,

t — нечетное целое число .

Задание различных начальных значений V0 позволяет формировать различные последовательности случайных чисел.

Количество случайных чисел в одном периоде от нескольких тысяч до сотен тысяч.

Для перевода равномерно распределенных случайных чисел из отрезка [0,1] в отрезок [а,b] можно использовать:

Задачу моделирования случайных величин с нормальным законом распределения решают в несколько этапов:

  1. Вначале имитируют равномерное распределение и получают последовательность псевдослучайных чисел, равномерно распределенных на интервале [0,1] .
  2. Затем, используя равномерно распределенную псевдослучайную величину, получают последовательность псевдослучайных чисел с нормальным законом распределения (чаще всего в нормированном виде, т.е. М(X) = 0 . ).

Пусть Y – равномерно распределенная случайная величина на интервале, [0,1] . Необходимо получить случайную величину X c нормальным законом распределения.

Различают три основных способа формирования последовательности нормально распределенных случайных величин:

  1. Прямое преобразование псевдослучайного числа y являющегося реализацией случайной величины Y , равномерно распределенной на интервале [0,1] , с помощью некоторой функции W в число x , которое может рассматриваться как реализация случайной величины X , имеющей нормальный закон распределения.
  2. Отсеивание псевдослучайных чисел из первоначальной последовательности Y равномерно распределенной на интервале [0,1] , таким образом, чтобы оставшиеся числа были распределены по нормальному закону.
  3. Моделирование условий, соответствующих центральной предельной теореме теории вероятности.

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

Метод полярных координат относится к первому способу получения последовательности псевдослучайных чисел с нормальным законом распределения. Метод вычисляет две независимые нормально распределенные случайные величины x1 и x2 со средним значением, равным нулю, и среднеквадратичным отклонением , равным единице, по двум заданным независимым равномерно распределенным случайным числам y1 и y2 .

Генератор случайных чисел в Matlab

Что такое генератор случайных чисел?

Прежде чем понять генератор случайных чисел в Matlab, давайте сначала изучим, что такое генератор случайных чисел. Генератор случайных чисел — это создание случайных чисел без каких-либо решений или заметных шаблонов среди них. Существуют различные способы генерирования случайных чисел в MATLAB с различными приложениями. Он используется во многих языках программирования для генерации случайных значений в указанном диапазоне. Есть разные функции, которые используются в соответствии с языком. Они в основном используются в области компьютерных наук, исследований и статистических работ.

Генератор случайных чисел в Matlab

В MATLAB псевдослучайные числа генерируются с использованием различных функций, таких как rand, randi и randn. Каждая функция служит для разных целей в MATLAB, как указано ниже:

  • rand: эта функция используется для генерации равномерно распределенных случайных значений.
  • randi: эта функция используется для генерации нормально распределенных псевдослучайных значений.
  • randn: эта функция используется для генерации нормально распределенных случайных значений.
  • randperm: используется для создания случайных случайных значений.
  • rng: контролирует генерацию случайных чисел
  • RandStream: используется для потока случайных чисел.
Читайте также  Щетки генератора ява 634

rand, randn, randi и randperm в основном используются для создания массивов случайных значений.

Функции в генераторе случайных чисел в Matlab

Ниже приведены функции, предназначенные для другой цели в MATLAB, как указано ниже:

1. ранд

Функция rand используется, когда распределение равномерно и всегда генерирует действительные числа от 0 до 1. Обозначается функцией rand ().

Пример: a=rand(100, 1)

Приведенный выше пример объясняет, что a является вектором столбца 100 на 1, который содержит числа из равномерного распределения. содержит значения от 0 до 1. График этого обычно плоский, поскольку он составлен из равномерного распределения.

rand (‘state’) возвращает текущее состояние генератора. Мы также можем изменить состояние генератора, используя следующий код:

  • rand (‘state’, s): сбрасывается в состояние s.
  • rand (‘state’, 0): устанавливает исходное состояние генератора.
  • rand (‘state’, k): устанавливает генератор в его k-е состояние для любого значения k.
  • rand (‘state’, sum (100 * clock)): каждый раз сбрасывается в другое состояние.

2. Рэнди

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

Пример: b= randi(1, 1000, 100)

Здесь b содержит целые числа, взятые из равномерного распределения в диапазоне от 1 до 100. График результирующего набора будет в целом плоским, поскольку он возвращает числа из равномерного распределения.

3. Рандн

Эта функция возвращает целые числа, полученные в результате нормального распределения. Это отмечено с помощью функции randn (). График результирующего набора соответствует нормальному распределению, имеющему среднее значение 0 и стандартное отклонение 1.

Пример: c=randn(100, 1)

randn (‘state’) возвращает текущее состояние генератора. Мы также можем изменить состояние генератора, используя следующий код:

  • randn (‘state’, s): сбрасывается в состояние s
  • randn (‘state’, 0): устанавливает исходное состояние генератора
  • randn (‘state’, k): устанавливает генератор в его k-е состояние для любого значения k.
  • randn (‘state’, sum (100 * clock)): каждый раз сбрасывается в другое состояние.

4. randperm

Эта функция возвращает массив уникальных значений. Основное различие между randi и randperm состоит в том, что randi содержит массив значений, которые можно повторить, но randperm содержит массив уникальных целых чисел. Обозначается с помощью randperm ().

Пример: d= randperm(20, 10)

Это массив 1 на 10, который содержит целые числа в диапазоне (1, 20).

Функции Генерация случайных чисел

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

  • rng (семя) : оно порождает генерацию случайных чисел, так что оно рисует случайные числа, которые являются предсказуемыми.
  • rng (shuffle): генерирует случайные числа в зависимости от текущего времени. Таким образом, он генерирует числа после вызова функции rng.
  • rng (‘default’): эта функция используется для установки настроек, используемых функцией rand, randn, randi, в состояние по умолчанию.
  • scurr: возвращает настройки, используемые в настоящее время в функциях rand, randn, randi.
  • rng (s): восстанавливает настройку, используемую для создания случайных чисел в функциях rand, randn, randi.

Вывод — генератор случайных чисел в Matlab

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

Рекомендуемые статьи

Это руководство для генератора случайных чисел в Matlab. Здесь мы подробно обсудим различные функции в Генераторе случайных чисел в Matlab. Вы также можете просмотреть другие наши статьи, чтобы узнать больше —

  1. Введение в Matlab
  2. Генератор случайных чисел в Python
  3. Обратный номер в C
  4. Генератор случайных чисел в R
  5. Генератор случайных чисел в C # | Функции | Примеры
  6. Приложения Matlab Compiler
  7. Числовые Шаблоны в Java | Лучшие 14 примеров

Generating Random Numbers/ru

Случайные числа являются важными ресурсами для научных приложений, образования, разработки игр и визуализации. Они играют ключевую роль в численном моделировании.

Генерируемые алгоритмом случайные числа являются псевдослучайными числами. Они принадлежат (большому) набору повторяющихся чисел, последовательность которых невозможно или, по крайней мере, трудно предсказать. В отличие от Delphi, в котором используется линейный конгруэнтный генератор (см. Delphi compatible LCG Random), Free Pascal использует алгоритм MersenneTwister для своей стандартной random функции, определенной в RTL. Перед первым использованием генератор случайных чисел FPC должен быть проинициализирован единичным вызовом функции randomize , которая устанавливает начальное число генератора. Предпочтительнее это делать на этапе запуска программы.

Кроме того, в системах на основе Unix и Linux доступны виртуальные устройства /dev/random и /dev/urandom . Они генерируют (псевдо) случайные числа на основе оборудования.

Третий вариант — использовать случайные числа из внешних источников, либо из специализированных аппаратных устройств, либо из общедоступных источников, например. на основе данных радиоактивного распада.

Contents

  • 1 Равномерное распределение
  • 2 Нормальное (гауссово) распределение
  • 3 Экспоненциальное распределение
  • 4 Гамма-распределение
  • 5 Распределение Эрланга
  • 6 Распределение Пуассона
  • 7 t-распределение (Стьюдента)
  • 8 Распределение хи-квадрат
  • 9 F-распределение (Фишера)
  • 10 См.также
  • 11 Рекомендации

Равномерное распределение

Непрерывное равномерное распределение (также называемое прямоугольным распределением) представляет собой семейство симметричных вероятностных распределений. Здесь для каждого члена семьи все интервалы одинаковой длины в поддержке распределения одинаково вероятны.

Стандартная функция RTL random генерирует случайные числа с равномерным распределением. При вызове без параметра random выдает псевдослучайное число с плавающей запятой в интервале [0, 1), т.е. 0 random вызывается с аргументом longint L, возвращается случайное значение longint в интервале [0, L).

Дополнительный набор равномерно распределенных генераторов случайных чисел представлен в генераторах псевдослучайных чисел Марсальи.

Равномерно распределенные случайные числа полезны не для каждого приложения. Для создания случайных чисел других распределений необходимы специальные алгоритмы.

Нормальное (гауссово) распределение

Одним из наиболее распространенных алгоритмов получения нормально распределенных случайных чисел из равномерно распределенных случайных чисел является преобразование Бокса-Мюллера. Следующая функция вычисляет распределенные по Гауссу случайные числа:

Тот же алгоритм используется функцией randg randg из модуля RTL math:

Экспоненциальное распределение

Экспоненциальное распределение часто встречается в реальных задачах. Классическим примером является распределение времени ожидания между независимыми пуассоновскими случайными событиями, например, радиоактивный распад ядер [Press et al. 1989].

Следующая функция возвращает одно действительное случайное число из экспоненциального распределения. Rate является обратным к среднему значению, а константа RESOLUTION определяет гранулярность генерируемых случайных чисел.

Гамма-распределение

Гамма-распределение — это двухпараметрическое семейство непрерывных случайных распределений. Это обобщение как экспоненциального распределения, так и распределения Эрланга. Возможные применения гамма-распределения включают моделирование и имитацию линий ожидания, или очередей, и актуарную(страховую) науку.

Следующая функция возвращает одно действительное случайное число из гамма-распределения. Форма распределения определяется параметрами a, b и c. Функция использует функцию randomExp, как определено выше.

Распределение Эрланга

Распределение Эрланга — это двухпараметрическое семейство непрерывных распределений вероятностей. Это обобщение экспоненциального распределения и частный случай гамма-распределения, где c — целое число. Распределение Эрланга было впервые описано Агнером Крарупом Эрлангом для моделирования временного интервала между телефонными звонками. Он используется для теории очередей и для моделирования линий ожидания.

Распределение Пуассона

Распределение Пуассона применяется к целочисленным значениям. Оно представляет вероятность успеха k, когда вероятность успеха в каждом испытании мала, а частота появления (среднее значение) постоянна.

t-распределение (Стьюдента)

t-распределение (также относится к t-распределению Стьюдента, поскольку оно было опубликовано Уильямом Сили Госсетом в 1908 году под псевдонимом Student) — это непрерывное распределение вероятностей. Его форма определяется одним параметром, степенями свободы (df). В статистике много оценок являются t-распределением. Таким образом, t-распределение Стьюдента играет главную роль в ряде широко используемых статистических анализов, включая t-критерий Стьюдента для оценки статистической значимости разницы между двумя средними выборками, построение доверительных интервалов для разницы между двумя средними значениями, и в линейном регрессионном анализе. Т-распределение также возникает при Байесовском выводе данных из нормального семейства.

Следующий алгоритм зависит от функции RTL random и от функции randomChisq

Распределение хи-квадрат

Распределение хи-квадрат — это непрерывное распределение случайных чисел со степенями свободы df. Это распределение суммы квадратов независимых стандартных нормальных случайных величин. Распределение хи-квадрат имеет множество применений в выводной статистике, например, в оценке дисперсий и для тестов хи-квадрат. Это специальное гамма-распределение с c = df/ 2 and b = 2. Поэтому следующая функция зависит от функции randomGamma.

F-распределение (Фишера)

Распределение F, также называемое распределением Фишера-Снедекора, является непрерывным распределением вероятности. Используется для F-теста(критерия Фишера) и ANOVA(ANalysis Of VAriance, или дисперсионный анализ). Оно имеет две степени свободы, которые служат параметрами формы v и w, и являются положительными целыми числами. Следующая функция randomF использует randomChisq.

Генерация случайных чисел в соответствии с нормальным распределением в C / C ++

Как я могу легко генерировать случайные числа в соответствии с нормальным распределением в C или C ++?

Я не хочу использовать Boost.

Я знаю, что Кнут подробно рассказывает об этом, но сейчас у меня под рукой нет его книг.

Читайте также  Щуп генератор для настройки радио

Преобразование Бокса-Мюллера обычно используется. Он правильно производит значения с нормальным распределением. Математика проста. Вы генерируете два (однородных) случайных числа, и применяя к ним формулу, вы получаете два нормально распределенных случайных числа. Верните один, а другой сохраните для следующего запроса случайного числа.

C ++ 11

С ++ 11 предлагает std::normal_distribution , и я бы пошел именно по этому пути.

C или более ранний C ++

Вот несколько решений в порядке возрастания сложности:

Добавьте 12 одинаковых случайных чисел от 0 до 1 и вычтите 6. Это будет соответствовать среднему значению и стандартному отклонению нормальной переменной. Очевидным недостатком является то, что диапазон ограничен до ± 6 — в отличие от истинного нормального распределения.

Преобразование Бокса-Мюллера. Это перечислено выше и относительно просто реализовать. Однако, если вам нужны очень точные образцы, имейте в виду, что преобразование Бокса-Мюллера в сочетании с некоторыми однородными генераторами страдает аномалией, называемой эффектом Neave 1 .

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

1. HR Neave, «Об использовании преобразования Бокса-Мюллера с мультипликативными конгруэнтными генераторами псевдослучайных чисел», Applied Statistics, 22, 92-97, 1973

Быстрый и простой способ — просто просуммировать несколько равномерно распределенных случайных чисел и взять их среднее значение. См. Центральную предельную теорему для полного объяснения того, почему это работает.

Он сравнивает несколько алгоритмов, в том числе

  • Метод центральной предельной теоремы
  • Преобразование Бокса-Мюллера
  • Полярный метод Марсальи
  • Алгоритм зиккурата
  • Метод обратного преобразования выборки.
  • cpp11random использует C ++ 11 std::normal_distribution with std::minstd_rand (на самом деле это преобразование Бокса-Мюллера в clang).

Результаты float версии single-precision ( ) на iMac [email protected], clang 6.1, 64-bit:

Для правильности программа проверяет среднее значение, стандартное отклонение, асимметрию и эксцесс образцов. Было обнаружено, что метод CLT путем суммирования 4, 8 или 16 однородных чисел не имеет хорошего эксцесса, как другие методы.

Алгоритм зиккурата имеет лучшую производительность, чем другие. Однако он не подходит для параллелизма SIMD, так как требует поиска в таблице и переходов. Box-Muller с набором инструкций SSE2 / AVX намного быстрее (x1,79, x2,99), чем не-SIMD версия алгоритма зиккурата.

Поэтому я предлагаю использовать Box-Muller для архитектуры с наборами инструкций SIMD, в противном случае это может быть зиккуратным.

PS тест использует простейший LCG PRNG для генерации равномерно распределенных случайных чисел. Поэтому для некоторых приложений этого может быть недостаточно. Но сравнение производительности должно быть справедливым, потому что все реализации используют один и тот же PRNG, поэтому тест в основном проверяет производительность преобразования.

Вот пример C ++, основанный на некоторых ссылках. Это быстро и грязно, лучше не изобретать заново и не использовать библиотеку ускорения.

Вы можете использовать график QQ, чтобы изучить результаты и посмотреть, насколько хорошо оно приближается к реальному нормальному распределению (ранжируйте ваши образцы 1..x, превратите ранги в пропорции от общего количества x, т.е. сколько образцов, получите z-значения и начертите их. Желаемый результат — прямая линия вверх).

Пространство имен std :: tr1 не является частью boost. Это пространство имен, которое содержит дополнения к библиотеке из Технического отчета C ++ 1 и доступно в современных компиляторах Microsoft и gcc, независимо от boost.

Вот как вы создаете образцы на современном компиляторе C ++.

Вы можете использовать GSL . Даны несколько полных примеров, чтобы продемонстрировать, как его использовать.

Взгляните на: http://www.cplusplus.com/reference/random/normal_distribution/ . Это самый простой способ получить нормальные распределения.

Если вы используете C ++ 11, вы можете использовать std::normal_distribution :

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

Я следил за определением PDF-файла, приведенным в http://www.mathworks.com/help/stats/normal-distribution.html, и пришел к следующему:

Возможно, это не лучший подход, но он довольно простой.

Список часто задаваемых вопросов на comp.lang.c содержит три различных способа простого генерирования случайных чисел с распределением Гаусса.

Существуют различные алгоритмы обратного кумулятивного нормального распределения. Самые популярные в количественном финансировании тестируются на http://chasethedevil.github.io/post/monte-carlo—inverse-cumulative-normal-distribution/

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

Кроме того, он показывает недостатки зиккуратоподобных подходов.

Главный ответ здесь выступает за Box-Müller, вы должны знать, что у него есть известные недостатки. Цитирую https://www.sciencedirect.com/science/article/pii/S0895717710005935 :

в литературе Бокса – Мюллера иногда считают немного хуже, в основном по двум причинам. Во-первых, если применить метод Бокса – Мюллера к числам из плохого линейного конгруэнтного генератора, преобразованные числа обеспечат очень плохое покрытие пространства. Графики преобразованных чисел со спиралевидными хвостами можно найти во многих книгах, в первую очередь в классической книге Рипли, который, вероятно, первым сделал это наблюдение «

1) Графически интуитивно понятный способ генерации гауссовских случайных чисел — это использование чего-то похожего на метод Монте-Карло. Вы должны сгенерировать случайную точку в рамке вокруг кривой Гаусса, используя генератор псевдослучайных чисел в C. Вы можете вычислить, находится ли эта точка внутри или под распределением Гаусса, используя уравнение распределения. Если эта точка находится внутри распределения Гаусса, то у вас есть гауссовское случайное число в качестве значения x точки.

Этот метод не идеален, потому что технически кривая Гаусса стремится к бесконечности, и вы не можете создать коробку, которая приближается к бесконечности в измерении x. Но кривая Гуасса довольно быстро приближается к 0 в измерении y, так что я не буду об этом беспокоиться. Ограничение размера ваших переменных в C может быть более ограничивающим фактором для вашей точности.

2) Другой способ — использовать Центральную предельную теорему, которая утверждает, что при добавлении независимых случайных величин они образуют нормальное распределение. Помня об этой теореме, вы можете аппроксимировать гауссовское случайное число, добавив большое количество независимых случайных величин.

Эти методы не самые практичные, но этого следует ожидать, если вы не хотите использовать уже существующую библиотеку. Имейте в виду, что этот ответ исходит от человека, практически не имеющего опыта в расчетах или статистике.

Метод Монте-Карло . Наиболее интуитивно понятный способ сделать это — использовать метод Монте-Карло. Возьмите подходящий диапазон -X, + X. Большие значения X приведут к более точному нормальному распределению, но для схождения потребуется больше времени. а. Выберите случайное число z от -X до X. b. Сохраняйте с вероятностью, N(z, mean, variance) где N — гауссово распределение. В противном случае отбросьте и вернитесь к шагу (а).

Посмотри, что я нашел.

Эта библиотека использует алгоритм Зиккурата.

Компьютер — детерминированное устройство. В расчетах нет случайности. Более того, арифметическое устройство в CPU может вычислять сумму по некоторому конечному набору целых чисел (выполняя вычисление в конечном поле) и конечному набору действительных рациональных чисел. А также выполнял побитовые операции. Математика имеет дело с более хорошими наборами, такими как [0.0, 1.0] с бесконечным количеством баллов.

Вы можете прослушивать какой-то провод внутри компьютера с каким-то контроллером, но будет ли он иметь равномерное распределение? Я не знаю. Но если предположить, что этот сигнал является результатом накопления значений огромного количества независимых случайных величин, то вы получите примерно нормально распределенную случайную величину (это было доказано в теории вероятностей).

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

Один из популярных методов — вы можете суммировать 12 irv с равномерными распределениями . Но, честно говоря, при выводе центральной предельной теоремы с помощью преобразования Фурье, рядов Тейлора необходимо пару раз иметь n -> + inf предположений. Так, например, теоретически — лично я не понимаю, как люди выполняют суммирование 12 irv с равномерным распределением.

В университете я изучал теорию вероятностей. И, в частности, для меня это просто математический вопрос. В университете я увидел такую ​​модель:

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

Доказательство ее правильности можно найти в книге «Москва, БМГТУ, 2004: XVI Теория вероятностей, пример 6.12, с.246-247» в издании Крищенко Александра Петровича ISBN 5-7038-2485-0

К сожалению, мне неизвестно о существовании перевода этой книги на английский язык.

Яков Кузнецов/ автор статьи

Приветствую! Я являюсь руководителем данного проекта и занимаюсь его наполнением. Здесь я стараюсь собирать и публиковать максимально полный и интересный контент на темы связанные ремонтом автомобилей и подбором для них запасных частей. Уверен вы найдете для себя немало полезной информации. С уважением, Яков Кузнецов.

Понравилась статья? Поделиться с друзьями:
NEVINKA-INFO.RU
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: