Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабы / реферат Черкасова.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
5.24 Mб
Скачать

Федеральное агенство воздушного транспорта (росавиация)

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ГРАЖДАНСКОЙ АВИАЦИИ» (МГТУ ГА)

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

Реферат защищен с оценкой ________________________________________

____________________

(подпись преподавателя, дата)

Реферат

по дисциплине «Моделирование вычислительных систем и сетей».

Тема: «Программные генераторы».

Выполнили студенты группы ИС221

Магальник Е. Б. и Бродников С. А.

Руководитель: Черкасова Наталия Ивановна

МОСКВА – 2025

Аннотация.

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

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

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

Оглавление

Введение 4

Цель 4

Функции, на которых базируются генераторы 4

Зерно 5

Линейный конгруэнтный генератор 8

XORShift 9

Вихрь Мерсенна 11

Сравнение генераторов 13

Вывод 15

Введение.

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

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

Цель.

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

Функции, на которых базируются генераторы.

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

Чаще всего для того, чтобы получить некую «случайность», используются следующие методы:

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

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

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

К вычисляемым функциям предъявляются следующие требования:

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

  • Портируемость алгоритма на различные системы. 

  • Скорость получения последовательности. Чем быстрее, тем лучше. 

  • Повторяемость результата. Это очень важный показатель. От него зависят все компьютерные игры, которые используют генераторы миров и различные системы с аналогичной функциональностью. Воспроизводимость даёт нам общий контент для всех, то есть мы можем генерировать на отдельных клиентах одинаковое содержимое. Также мы можем генерировать контент на лету в зависимости от входных данных, например, от местоположения игрока в мире. Ещё повторяемость случайных чисел используется для сохранения конкретного контента в виде зерна. То есть мы можем держать у себя только какое-то число или массив чисел, на основе которых будут генерироваться нужные нам параметры для заранее отобранного контента.

Зерно.

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

Рис. 1. Визуализация работы зерна.

var random = new Random(0); var rn0 = random.Next(); var rn1 = random.Next(); var rn2 = random.Next();

На иллюстрации просто инициализирован стандартный генератор случайных чисел из стандартной библиотеки C#. При инициализации отправляем в него некоторое число — seed (зерно), — в данном случае это 0. Затем по очереди берём по одному числу методом Next. Но тут мы столкнёмся с первой проблемой: генерирование всегда будет последовательным. Мы не можем получить сразу i-тый элемент последовательности. Для получения второго элемента последовательности необходимо сначала задать зерно, потом вычислить нулевой элемент, за ним первый и только потом уже второй, третий и i-й.

Решить эту проблему можно будет с помощью разделения одного генератора на несколько отдельных.

Рис. 2. Разделение одного зерна на несколько разных.

var X = 0; var Y = 1; var Z = 2; var rs0 = new Random(X); var rs1 = new Random(Y); var rs2 = new Random(Z);

То есть берём несколько генераторов и задаём им разные зёрна. Но тут мы можем столкнуться со второй проблемой: нельзя гарантировать случайность i-тых элементов разных последовательностей с разными зёрнами.

Рис. 3. Визуализация проблемы повторения значений при разных зернах.

На иллюстрации изображён результат генерирования нулевого элемента последовательности с помощью стандартной библиотекой C#. Мы постепенно меняли зерно от 0 до N.

Рис. 4. Генерация нулевого элемента последовательности.

Линейный конгруэнтный генератор.

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

, где – модуль, – множитель от 0 до , – приращение от 0 до , – начальное значение от 0 до .

Линейная конгруэнтная последовательность, определенная числами , , и периодична с периодом, не превышающим . При этом длина периода равна тогда и только тогда, когда:

  1. Числа и взаимно простые;

  2. кратно для каждого простого , являющегося делителем ;

  3. кратно 4, если кратно 4.

Наличие этого свойства для случая , где — число битов в машинном слове.

Реализация на языке C#.

const long randMax = 4294967296; state = 214013 * state + 2531011; state ^= state >> 15; return (uint) (state % randMax);

Рис. 5. Визуализация результатов работы линейного конгруэнтного генератора.

При генерировании с одним зерном паттерн нигде не образуется. Но при использовании i-тых элементов в последовательностях с различными зёрнами паттерн начинает прослеживаться. Причём его вид будет зависеть исключительно от коэффициентов, которые мы подобрали для генератора.

XORShift.

XORShift — это простой генератор псевдослучайных чисел, известный своей скоростью и эффективностью. Он использует побитовые операции XOR для генерации последовательности псевдослучайных чисел. Алгоритм работает с внутренним состоянием и обновляет его при каждом вызове для получения нового случайного значения. Был разработан Джорджем Марсаглией.

Принцип работы:

  1. Взять копию начального значения. 

  2. Сдвинуть копию влево на определённое количество бит. 

  3. Выполнить операцию XOR между исходным начальным значением и сведённым для формирования результата первого шага. 

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

Генерация нового состояния выполняется последовательными побитовыми операциями:

x = x ^ (x << a)

x = x ^ (x >> b)

x = x ^ (x << c)

где x — состояние генератора,

a, b, c — заранее выбранные (заданные) целые числа, зависят от конкретного варианта алгоритма

Некоторые свойства алгоритма:

  • обладает хорошими статистическими свойствами, что делает его пригодным для различных приложений, требующих случайных чисел; 

  • прост в реализации и не опирается на сложные математические функции; 

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

Реализация на языке C#.

state ^= state << 13; state ^= state >> 17; state ^= state << 5; return state;

Рис. 6. Визуализация результатов работы генератора XORShift.

Вихрь Мерсенна.

Вихрь Мерсенна — генератор псевдослучайных чисел, разработанный в 1997 году японскими учёными Макото Мацумото и Такудзи Нисимура.  

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

Для обновления состояния:

y = (MT[i] & 0x80000000) + (MT[(i+1) mod 624] & 0x7fffffff)

MT[i] = MT[(i + 397) mod 624] ^ (y >> 1)

Если младший бит числа y нечётный, применяется дополнительное преобразование:

MT[i] = MT[i] ^ 0x9908b0df

Некоторые характеристики алгоритма:

  • Длинный период. Вихрь Мерсенна может генерировать огромное количество уникальных псевдослучайных чисел перед тем, как начнёт повторяться последовательность. 

  • Хорошее качество случайности. Алгоритм обеспечивает, что сгенерированные числа соответствуют статистическим свойствам случайных чисел. 

  • Производительность. Вихрь Мерсенна имеет хорошую производительность, что делает его привлекательным выбором для многих задач. 

Однако у алгоритма есть и недостатки: он не является криптостойким, что ограничивает его использование в криптографии.

Соседние файлы в папке лабы