Научная статья на тему 'Построение генератора случайных чисел на основе параллельного перемешивания'

Построение генератора случайных чисел на основе параллельного перемешивания Текст научной статьи по специальности «Математика»

CC BY
617
160
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ГЕНЕРАТОР СЛУЧАЙНЫХ ЧИСЕЛ / ПЕРЕМЕШИВАНИЕ СЛУЧАЙНЫХ ЧИСЕЛ / ИМИТАЦИОННОЕ МОДЕЛИРОВАНИЕ / ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ / СТАТИСТИЧЕСКОЕ МОДЕЛИРОВАНИЕ / МОДЕЛИРОВАНИЕ СЛУЧАЙНЫХ ВЕЛИЧИН

Аннотация научной статьи по математике, автор научной работы — Драгныш Николай Васильевич

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

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Построение генератора случайных чисел на основе параллельного перемешивания»

Построение генератора случайных чисел на основе параллельного перемешивания Драгныш Н. В.

Драгныш Николай Васильевич /Dragnysh Nikolay Vasilievich - кандидат технических наук, доцент, кафедра информатики, факультет математики, физики, информатики,

Таганрогский институт имени А. П. Чехова (филиал),

Ростовский государственный экономический университет (РИНХ), г. Таганрог

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

Ключевые слова: генератор случайных чисел, перемешивание случайных чисел, имитационное

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

Все занимающиеся исследованиями в области имитационного моделирования систем рано или поздно сталкиваются с проблемой выбора генератора случайных чисел (ГСЧ), который обеспечивал бы поток значений случайной величины, применяемой для исследования моделируемой системы. Неплохой обзор ГСЧ приведен в [1, с. 462]. Активно ГСЧ используются в образовании при обучении теории вероятности, теории массового обслуживания и многим другим дисциплинам [2, с. 26; 3, с. 80]. Стоит отметить, что ГСЧ является компьютерным аналогом случайной величины, распределенной по равномерному закону. Следовательно, оценку генераторов надо приводить относительно именно равномерной случайной величины. Известные генераторы бывают двух типов: аппаратные (не обладают переносимостью, используются в основном на производстве) и программные, которые, как правило, легко переносятся на большинство современных компьютеров, обладают достаточным быстродействием. Основную часть программных генераторов составляют линейные конгруэнтные генераторы (ЛКГ), то есть генераторы, в которых каждое следующее случайное число будет получено из предыдущего согласно заданной формуле (алгоритму). К недостаткам этого класса ГСЧ можно отнести:

• повторяемость последовательности случайных чисел при одинаковом начальном числе (это может быть полезно для сравнения двух моделей систем, при шифровании, но в большинстве случаев является недостатком);

• каждый ЛКГ обладает периодом - циклом, через который вся последовательность случайных чисел начинает повторяться;

• ЛКГ может выдать не все числа из своего периода, а только какую-то их часть, таким образом, между случайными числами образуются разрывы, часто детерминированного характера. Иначе говоря, случайные числа заполняют заданный интервал неравномерно (известны множество формул, с изученными константами, которые полностью используют свой диапазон, но на практике активно используют рандомизаторы для инициализации первого числа последовательности, что может и для хорошего ЛКГ привести к проблеме неполного заполнения диапазона);

• в силу того, что ГСЧ не повторит случайное число до тех пор, пока не будет выдан весь период случайных чисел, ни одно случайное число не может быть выдано 2 раза подряд, тогда как это возможное событие для равномерной случайной величины;

• если такой ЛКГ на некотором промежутке выдавал, например, чаще числа, меньшие математического ожидания, то в последующем он будет «вынужден» чаще выдавать числа, большие математического ожидания, что уже противоречит самому принципу случайности, а также говорит о корреляции случайных чисел, что недопустимо для равномерной случайной величины. Каждое новое значение должно появляться независимо от полученных ранее чисел;

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

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

В основу генератора положен массив, который заполнен всеми числами некоторого диапазона, например, от 0 до 109. Каждое число в массиве встречается один раз. Постоянно, независимо от основной программы и других программ происходит перемешивание позиций чисел в этом массиве. С помощью вспомогательного генератора случайных чисел (в качестве которого может использоваться ЛКГ) выбираются две позиции массива. И числа, расположенные в этих позициях, меняются местами.

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

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

Сам массив и вспомогательный генератор являются разделяемыми ресурсами этих потоков/частей. Причем для массива чисел необходимо использовать механизм блокировок (lock). Т. к. во время перемешивания возможен момент, когда в массиве есть два одинаковых числа, а одного числа из диапазона нет (позиции для замены выбраны, число первой позиции записано во временную переменную, а число второй позиции записано на первую позицию). Чтобы не нарушалась равномерность, перед перестановкой имеет смысл заблокировать массив, а после перестановки разблокировать. Что позволит основной программе получать доступ к массиву, только когда он корректен. Учитывая простоту и малое количество операций внутри блокировки, простоя основного потока практически не будет (максимум 3 процессорных операции).

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

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

Описанный генератор был реализован на языке С#. В качестве вспомогательного генератора использовался комбинированный ЛКГ, код которого приведен в [1]. Изначальный диапазон чисел выбран от 0 до 108-1 включительно (8 знаков). Исходный массив был проинициализирован последовательными числами в цикле. Через несколько минут перемешивания закономерности в массиве не наблюдались. В дальнейшем естественно использовались запись массива в файл при останове программы и чтение из файла при старте. Предварительные тесты показали хорошие результаты, в частности, оценки критерием хи-квадрат. В будущем будут проведены более подробные исследования данного генератора как на классические тесты для ГСЧ и на равномерность, так и тесты на независимость значений.

Очевидны и недостатки такого генератора: большой объем используемой оперативной памяти и постоянное использование процессорного времени на перемешивание. При этом необходимо дополнительно исследовать, насколько будет чувствительно качество генератора к размеру массива. Например, при необходимости 10 значащих знаков можно использовать массив размером 1010 и выбрать из него одно число, а можно из массива размером 105 два раза выбрать число и «склеить» итог. Памяти при этом будет использоваться в 105 раз меньше. Второй недостаток можно нивелировать, если поток основной программы закрепить за одним процессором, а поток перемешивания за другим в многопроцессорной системе, тогда они с точки зрения процессорных ресурсов совершенно не будут ограничивать друг друга. Если используется однопроцессорная система, либо основная программа использует все процессоры при параллельном программировании, то можно использовать в потоке перемешивания таймеры или паузы, но это может повлиять на качество перемешивания. Отдельным вопросом исследования такого генератора является то, какое влияние на его качество будут оказывать сильно интенсивное выбирание случайных чисел и регулярное выбирание чисел. Не станет ли при этом генератор чуть улучшенной версией вспомогательного генератора?

Литература

1. Кельтон В., Лоу А. Имитационное моделирование. Классика CS. - СПб.: Питер; Киев: Издательская группа BHV, 2004. 847 с.

2. Драгныш Н. В. Использование методов имитационного моделирования для преподавания курса «Теория вероятностей и математическая статистика». // Актуальные проблемы гуманитарных и естественных наук. 2011. № 12. С. 26-29.

3. Драгныш Н. В. Использование инновационных технологий для преподавания курса «Теория вероятностей и математическая статистика». // Дискуссия. 2010. № 8. С. 80-83.

i Надоели баннеры? Вы всегда можете отключить рекламу.