Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
билеты.doc
Скачиваний:
211
Добавлен:
16.04.2015
Размер:
257.54 Кб
Скачать

Билет 17. Алгоритм получения случайных чисел. Правильный выбор параметров линейного конгруэнтного генератора.

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

Способы получения случайных чисел

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

- тестирование алгоритмов;

- имитационное моделирование;

- некоторые задачи численного анализа;

- имитация пользовательского ввода.

Для получения случайных чисел можно использовать различные способы. В общем случае все методы генерирования случайных чисел можно разделить на аппаратные и программные. Устройства или алгоритмы получения случайных чисел называют генераторами случайных чисел (ГСЧ) или датчиками случайных чисел.

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

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

К программным ГСЧ относятся различные алгоритмы генерирования последовательности чисел, которая по своим характеристикам напоминает случайную. Для формирования очередного числа последовательности используются различные алгебраические преобразования. Одним из первых программных ГСЧ является метод средин квадратов, предложенный в 1946 г. Дж. фон Нейманом. Этот ГСЧ формирует следующий элемент последовательности на основе предыдущего путем возведения его в квадрат и выделения средних цифр полученного числа.

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

Линейный конгруэнтный метод(Разработал его Деррик Лемер) — один из алгоритмов генерации псевдослучайных чисел. Применяется в простых случаях и не обладает криптографической стойкостью. Входит в стандартные библиотеки различных компиляторов.

Для реализации алгоритма необходиом задать четыре параметра:

Диапазон значений m, при этом m > 0.

Множитель a (0 <= a <= m).

Инкрементирующее значение c (0 <= c <= m).

Начальное значение X0 (0 <= X0 < m).

Определив эти параметры, можно воспользоваться формулой:

Xi+1 = (aXi + c) % m (где i больше или равно 0)

i - номер элемента в последовательности.

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

Напоминаю что % - остаток от деления

Выбор m

Период не может быть больше числа m. Следовательно m должно быть довольно большим.

Лучше всего если бы m был равен максимальному элементу в последовательности imax+1 (единицу добавляем, так как отсчёт i идёт от нуля). Ещё одним популярным выбором является степень двойки 2n. При условии, что n - длина машинного слова в битах, от операции взятия остатка можно избавиться. Если m является степенью двойки, То операцию взятия остатка можно заменить на более быструю операцию поразрядного И (хотя для современных компьютеров это не актуально):

x % 2n == x & (2n - 1)

Примеры (x - целое число):

x % 2 == x & 1;

x % 4 == x & 3;

x % 8 == x & 7;

Очень часто для m выбирают одно из простых чисел Мерсенна. Часто число 231 - 1 используется, когда вычисления ведутся с 32-ух битными данными.

Множитель a

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

Инкремент c

Данный параметр можно выбирать довольно произвольно. Очень часто его задают в виде нуля, но при этом уменьшается длина периода и X0 != 0.

Начальное значение (seed)

Итак, мы выяснили, что в последовательности есть период. В нашем примере период равен всего четырём элементам. В других случаях период может быть очень большим, но он всегда есть! То есть при генерации случайных чисел линейным конгруэнтным методом если нам нужна очень большая последовательность, то в ней значения будут повторяться с определённой периодичностью.Т.е. у нас допустим есть генератор случайных чисел. Мы его используем для разных программ. Всегда, всегда этот генератор создаёт одинаковую последовательность чисел (при одинаковых начальных значениях). Мы можем только установить начальное значение.

Вообще говоря, с помощью арифметических методов нельзя построить по настоящему случайную последовательность чисел. Как невесело шутил наш друг - Джон Фон Нейман:

Характеристики ГСЧ

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

1. Период гаммы должен быть достаточно большим для шифрования сообщений различной длины.

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

3. Генерирование гаммы не должно быть связано с большими техническими и организационными трудностями.

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

Применение ГСЧ

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

Понятным языком

 Выбирается 4 числа:

  1. Модуль m (m>0);

  2. Множитель a (0<=a<m);

  3. Приращение c (0<=c<m);

  4. Начальное значение X0 (0<= X0<m)

Последовательность получается с использование следующей рекуррентной формулы: Xn+1=(a* Xn+c) mod m. Этот метод даёт действительно хорошие псевдослучайные числа, но, если взять числа m,a,c произвольно, то результат нас скорее всего разочарует. При m=7, X0=1, a=2, c=4 получится следующая последовательность: 1,6,2,1,6,2,1,… Очевидно, что эта последовательность не совсем подходит под определение случайной. Тем не менее, этот провал позволил нам сделать два важных вывода:

  1. Числа m,a,c, X0 не должны быть случайными;

  2. Линейный конгруэнтный метод даёт нам повторяющиеся последовательности.

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

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

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

  3. Если m кратно 4, то и a-1 должно быть кратно 4.

В завершении рассказа о линейном конгруэнтном методе надо сказать, что последовательности, получаемые с его помощью, хоть и являются в достаточном смысле случайными, тем не менее не являются криптографически стойкими. Т.к. зная 4 подряд идущих числа, криптоаналитик может составить систему уравнений, из которых можно найти a,c,m.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]