Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

М1

.docx
Скачиваний:
10
Добавлен:
03.06.2024
Размер:
875.77 Кб
Скачать

ГУАП

КАФЕДРА № 41

ОТЧЕТ

ЗАЩИЩЕН С ОЦЕНКОЙ

ПРЕПОДАВАТЕЛЬ

старший преподаватель Е.К. Григорьев

должность, уч. степень, звание подпись, дата инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №1

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

по курсу: МОДЕЛИРОВАНИЕ

РАБОТУ ВЫПОЛНИЛ

СТУДЕНТ ГР. № подпись, дата инициалы, фамилия

Санкт-Петербург 2024

1 Цель работы

Получить навыки моделирования наиболее известных генераторов равномерно распределенных псевдослучайных чисел в программной среде MATLAB/GNU Octave, а также первичной оценки качества полученных псевдослучайных чисел.

2 Ход работы

Реализован мультипликативный конгруэнтный генератор (Рисунок 1).

Рисунок 1 – Реализация Мультипликативного конгруэнтного генератора

Где , , , – операция взятия дробной части числа. Для старта генератору необходимо задать начальное значение . Задано где .

Реализация алгоритма на языке программирования Python:

def multiplicative_congruential_generator(amount):

A = 7**5

M = 2**32 - 1

Rn = 2**52

C = 0

R = np.zeros(amount)

for i in range(amount):

Rn = (A * Rn + C) % M

R[i] = Rn / M

return R

Реализован генератор Фибоначчи с запаздыванием (Рисунок 2).

Рисунок 2 – Реализация генератора Фибоначчи с запаздыванием

Где Rn – псевдослучайные числа в диапазоне [0,1]. a и b - целые положительные числа, называемые лагами или константами запаздывания. Для работы данному генератору требуется предыдущих сгенерированных случайных чисел. Выбраны и , используется набор чисел, сгенерированный мультипликативным конгруэнтным генератором.

Реализация генератора Фибоначчи с запаздыванием на языке программирования Python:

def lagged_fibonacci_generator(amount, a, b):

R = multiplicative_congruential_generator(amount)

for n in range(max(a, b), amount):

if R[n-a] >= R[n-b]:

R[n] = R[n-a] - R[n-b]

elif R[n-a] < R[n-b]:

R[n] = R[n-a] - R[n-b] + 1

return R

Для реализации алгоритма Вихрь Мерсенна использован метод random.rand из библиотеки numpy, работающий на основе этого алгоритма:

result = np.random.rand(amount)

Для каждого набора случайных чисел построена гистограмма (Рисунок 3).

.

Рисунок 3 – Гистограммы

Из гистограмм видно, что распределение значений для всех трёх генераторов и трёх размеров выборки равномерное, так как нет значительного смещения частоты в какую-либо сторону — полосы гистограммы распределены равномерно по всему диапазону значений от 0 до 1. С увеличением размера выборки распределение значений становится более равномерным, что видно по более ровным гистограммам для больших выборок.

Для каждого набора случайных чисел построен график ECDF (Рисунок 4).

Рисунок 4 – Графики ECDF

По графикам видно, что для всех генераторов случайных чисел и размеров выборки функция ECDF представляет собой почти прямую линию, что характерно для равномерного распределения, при котором каждое значение в пределах диапазона от 0 до 1 равновероятно.

Для каждого набора данных построен график распределения на плоскости (Рисунок 5).

Рисунок 5 – Распределение на плоскости

Полученные графики показывают, что закономерностей в распределении на плоскости нет – распределение равномерное.

Вычислены оценки математического ожидания, дисперсии и среднеквадратического отклонения (СКО) для каждой выборки (Рисунок 6).

Рисунок 6 – Метрики

Математическое ожидание для всех генераторов и выборок колеблется вокруг 0.5, что соответствует ожидаемому значению для равномерно распределенной величины на интервале [0, 1]. Это указывает на то, что все генераторы в среднем выдают числа, распределенные равномерно по данному интервалу.

Дисперсия варьируется очень незначительно и в основном остается в пределах 0.083-0.085 для всех генераторов и размеров выборки. Теоретическая дисперсия для равномерного распределения на интервале [0, 1] равна 1/12, или примерно 0.0833, что хорошо соответствует представленным значениям.

Среднеквадратическое отклонение также находится примерно на одном уровне для всех генераторов и выборок, составляя около 0.289. Это значение среднеквадратического отклонения соответствует квадратному корню из дисперсии равномерного распределения на интервале [0, 1].

Из анализа данных видно, что все три генератора работают хорошо и дают значения, соответствующие равномерному распределению.

1. Создание массива x с использованием np.linspace, который генерирует последовательность чисел на заданном интервале. Здесь он используется для создания последовательности точек на интервале от -0.1 до 1.1.

2. Вычисление плотности распределения f(x) для равномерного распределения на интервале [0, 1]. Поскольку это равномерное распределение, плотность вне этого интервала равна нулю, а внутри - единице.

3. Вычисление функции распределения F(x), которая показывает, какая доля значений меньше или равна текущему значению x. В этом случае F(x) равна 0 для x < 0, линейно возрастает от 0 до 1 для 0 ≤ x < 1 и равна 1 для x ≥ 1.

Графики визуализируют основные характеристики равномерного распределения: постоянную плотность и линейное увеличение вероятности от начального до конечного значения. На графике плотности видны вертикальные линии, что указывает на использование ступенчатой функции (np.where) для создания плотности распределения, и идеально прямая линия на графике функции распределения, отражающая равномерное накопление вероятности по мере увеличения x.

3 Вывод

Соседние файлы в предмете Моделирование