
М1
.docxГУАП
КАФЕДРА № 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 Вывод