Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Методы Монте-Карло для параллельных вычислений. Учебное пособие
.pdf
Глава 2. Генераторы псевдослучайных чисел
2.1. О генераторах псевдослучайных чисел
Решение задач методом Монте-Карло существенным образом полагается на умение строить последовательности случайных чисел. Получить настоящую случайную последовательность возможно, если наблюдать какую-нибудь реальную физическую систему известного рода.
Например, можно регистрировать моменты попадания радиоактивных
частиц в счетчик. В процессе работы компьютера также существует
множество событий, связанных, например, с нажатиями клавиш на клавиатуре или движениями мыши. Некоторые операционные системы собирают такого рода информацию и организуют выдачу последовательности случайных байт. Современные физические датчики случайных
чисел используют разнообразные источники случайности в микро- и
макромире, такие как дробовой шум, термальный шум, фотоэлектрический шум, атмосферный радиошум. Например, нерегулярности квантовых явлений возможно измерять, усиливать и затем переводить из
аналоговой в дискретную (оцифрованную) форму с помощью микросхем и включать такие физические датчики случайных чисел в виде
отдельных подключаемых устройств или цепей микропроцессора. Такого рода случайные числовые последовательности могут быть использованы, например, для нужд криптографии. Недостатком является их
потенциальная невоспроизводимость, что плохо для отладки и тестирования программ.
Для применений важно иметь последовательность независимых
равномерно распределенных в интервале (0, 1) случайных величин U0,
U1, . . . , Un, . . . . Независимость и равномерное распределение озна-
чают следующее: для целого n > 0 и произвольных подынтервалов ∆0,
∆1, . . . интервала (0, 1) имеет место равенство
P({U0∈ ∆0, U1∈ ∆1, . . . , Un∈ ∆n}) = |∆0| · |∆1|··· |∆n|.
В вычислительной практике пользуются специальными неслучайными
последовательностями. Такие детерминированные последовательности
{Xn; n = 0, 1, . . .} обладают следующим интуитивно понятным свой-
ством: знание некоторого начального отрезка X0, X1, . . . , Xnпоследовательности не дает очевидного предсказания следующих членов X
X
, . . . последовательности. Как правило, эти последовательности
n+2
n+1
образуются по некоторым функциональным закономерностям (вычис-
21
,

лительным алгоритмам) вида
X
= f(Xn), n = 0, 1, . . .
n+1
или
X
= f(X
n+k
где числа X0или X0, X1, . . . , X
n+k−1
, X
, . . . , Xn), n = 0, 1, . . . ,
n+k−2
заданы.
k−1
Рассмотрим один пример получения «нерегулярной» числовой
последовательности [8]. Пусть α — некоторое число из интервала (0, 1),
и образуем последовательность по формуле:
Xn= {nα}.
Здесь {·} — дробная часть стоящего в скобках числа. Г. Вейлем была доказана замечательная теорема о том, что для иррационального α
так определенная последовательность чисел равномерно распределена
на (0, 1). Под равномерной распределенностью понимается следующее:
для любых величин y1и y2, 0 6 y1< y26 1,
1
lim
n→∞
× N({i: y16 Xi6 y2; i = 1, 2, . . . , n})= y2− y1,
n
где N(·) обозначает мощность конечного множества, указанного в скобках. Например, при α =√2 первые 20 чисел последовательности будут
(читать по строкам):
0,41421356 0,82842712 0,24264069 0,65685425
0,07106781 0,48528137 0,89949494 0,31370850
0,72792206 0,14213562 0,55634919 0,97056275
0,38477631 0,79898987 0,21320344 0,62741700
0,04163056 0,45584412 0,87005769 0,28427125
На рис. 2.1 представлено частотное распределение первых 100 чисел
при α =√2. Видно хорошее согласие с равномерным распределением.
Строгая количественная мера согласия генерируемой числовой последовательности с выбранным законом распределения приводится во многих
работах по датчикам случайных чисел, например, в монографии [22].
Кроме одномерных распределений следует изучить совместные
распределения стоящих рядом членов последовательности. Если соседние члены последовательности «независимы», то точки с координатами
(X
, Xn), n = 0, 1, . . . должны быть равномерно рассеяны внут-
n+1
ри единичного квадрата. Однако рис. 2.2 показывает, что существует
22

Гистограмма относительных частот
частота
0
0,02
0,04
0,06
0,08
0,1
0,12
x
0 0,2 0,4 0,6 0,8 1
Рис. 2.1. Гистограмма чисел X0, X1, . . . , X99при α =√2
стремление точек выстраиваться вдоль двух отрезков. Мы видим, что
о статистической независимости соседних членов последовательности
говорить невозможно. Таким образом, статистический анализ рассматриваемой последовательности {Xn; n = 0, 1, . . .} отвергает ее как
кандидата в псевдослучайные последовательности.
Наряду со статистическим обследованием предлагаемого функционального преобразования полезно провести и теоретический анализ.
Он выявит, что генератор, основанный на этом принципе, обладает двумя существенными недостатками. Во-первых, соседние члены последовательности не являются статистически независимыми. Заметим, что
(
X
n+1
α + X
=
n
Xn+ α − 1 при Xn> 1 − α.
при Xn6 1 − α,
Таким образом, величины Xnи X
функционально зависимы. На
n+1
рис. 2.2 точки располагаются на прямых
Рассмотрим случайные величины Y и Z, удовлетворяющие функциональному соотношению
y = x + (√2 −1), y = x +√2.
(
α + Y при Y 6 1 −α,
Z =
α − 1 + Y при Y > 1 −α,
23

0.0 0.2 0.4 0.6 0.8 1.0
0.0 0.2 0.4 0.6 0.8 1.0
X[n+1]
X[n]
Рис. 2.2. Совместное выборочное распределение точек {(X
= 0, 1, . . . , 49}
, Xn); n =
n+1
и предположим, что Y равномерно распределен в интервале (0, 1). Тогда Z также имеет равномерное распределение в интервале (0, 1). Можно считать, что пара (Xn, X
) является выборочной реализацией для
n+1
(Y , Z). Вычислим ковариацию между Y и Z:
cov(Y , Z ) = MY −
Ковариация не обращается в нуль, если α не есть
недостаток в том, что при вычислении на компьютере вещественные
числа представляются неточно и в определенный момент последовательность может выродиться. Действительно, для больших значений n
представления с плавающей точкой для nα и (n + 1)α не различаются,
либо различаются несколькими младшими битами. Тогда члены после-
1
Z −
2
1
Z
+
y(y + α − 1) dy −
1−α
24
1−α
Z
1
=
2
y(y + α)dy+
0
1
4
1
±
12
−
1
2√3
1
α(1 −α).
2
. Второй же
=
1
2

довательности будут принимать только значения вида 0, 0,5, 0,25, и т. д.
Отметим, что в настоящее время уже предложено большое число
критериев оценки качества генераторов случайных чисел [12, 22, 41].
Выяснение положительных и отрицательных свойств конкретных генераторов — актуальная тема для новых исследований. Поэтому в последующих разделах мы уделяем внимание в основном реализации алгоритмов при параллельных вычислениях.
2.2. Линейный конгруэнтный генератор
В линейном конгруэнтном генераторе последовательность псевдослучайных чисел образуется по закону
X
= aXn+ c mod m, (2.1)
n+1
где модуль m, множитель a, приращение c и начальное значение X0—
целые числа, удовлетворяющие условиям 0 6 a < m, 0 6 c < m, 0 6
6 X0< m. Задавая различные начальные значения X0, мы будем полу-
чать различные последовательности. Выбор модуля m чаще всего определяется разрядностью целых чисел.
Частным случаем линейного конгруэнтного генератора является
мультипликативный конгруэнтный генератор, определяемый соотношением (2.1) при c = 0.
При a = 1 генерируемая соотношением (2.1) последовательность
имеет вид Xn= (X0+ cn) mod m и, очевидно, плохо подходит на роль
«псевдослучайной».
Поскольку величина Xn, определяемая по формуле (2.1), может
принимать только конечное число значений, а значение Xnзависит
только от значения X
, последовательность {Xn; n = 0, 1, . . .} с
n−1
необходимостью периодическая — с периодом, не превосходящим m.
Длина периода может зависеть как от параметров a, c, n, так и от
начального значения X0. Действительно, мультипликативный конгруэнтный генератор (при c = 0) с начальным значением X0= 0 имеет
период 1 независимо от выбора a и m. Максимальная длина периода для мультипликативного конгруэнтного генератора не превосходит
m −1. Поэтому выбор параметров следует производить таким образом,
чтобы период был наибольший из возможных. Следующая теорема содержит критерий максимальной длины периода для линейного аддитивного конгруэнтного генератора.
25

Теорема 2.1 ([22]). Линейная конгруэнтная последователь-
ность (2.1), определенная числами m, a, c и X0, имеет период длиной
m тогда и только тогда, когда
1) числа c и m взаимно простые;
2) b = a −1 кратно p для каждого простого p, являющегося делите-
лем m;
3) b кратно 4, если m кратно 4.
Для формулировки аналогичного результата применительно к
мультипликативному конгруэнтному генератору необходимо ввести следующее определение. Пусть a и m — взаимно простые числа. Наименьшее число λ, для которого aλ≡ 1(mod m), называется порядком a по
модулю m и обозначается λ(m).
Теорема 2.2 ([22]). Максимальным периодом при c = 0 является
λ(m). Этот период достигается, если
1) X0и m — взаимно простые числа;
2) a является первообразным элементом по модулю m.
Пусть теперь число d, 1 < d < m, есть делитель числа m. Тогда
величины Yn= Xnmod d удовлетворяют соотношению
Y
= aYn+ c mod d.
n+1
В частности, если m = 2kи d = 2l, l < k, то Ynпредставляет собой l
младших битов числа Xnв k-разрядной двоичной арифметике. Тогда
период последовательности {Yn; n = 0, 1, . . .} не превосходит d, что
гораздо меньше максимально возможного периода исходной последовательности {Xn; n = 0, 1, . . .}. В этом случае говорят, что младшие
биты «менее случайны». Поэтому линейные конгруэнтные генераторы
не очень хорошо подходят для получения длинных «непредсказуемых»
последовательностей чисел из множества {0, 1, . . . , d − 1}.
В последние двадцать лет появился и обрел популярность обрат-
ный конгруэнтный генератор
X
= aXn+ c mod p, n > 0
n+1
с простым модулем p; черта над Xnозначает операцию взятия обратного по модулю p, Xn·Xn≡ 1(mod p). Полагают Xn∈ {0, 1, . . . , p−1, ∞},
26

0 = ∞, ∞ = 0. Известно, что обратная конгруэнтная последовательность не имеет решетчатой структуры, в отличие от линейной конгруэнтной последовательности.
2.3. Векторный линейный конгруэнтный генератор
Пусть имеется векторный компьютер с длиной вектора k. Из со-
отношения (2.1) для произвольного l = 1, 2, . . . имеем
X
n+l
= alXn+ (a
l−1
+ a
l−2
+ .. . + 1)c mod m. (2.2)
Основываясь на соотношении (2.2), можно предложить два алгоритма
для получения линейной конгруэнтной последовательности на векторном компьютере. Читатель, желающий ознакомиться с организацией
векторных вычислений в современных компьютерах, может обратиться
к приложению (c. 168).
В программе 2.1 представлена реализация Алгоритма I, использующая 128-битные регистры расширенного набора команд SSE. Здесь
a = 16807, c = 0, m = 231, k = 4.
Алгоритм I
Первый векторный линейный конгруэнтный генератор с единым
набором параметров
Для заданных X0, X1, . . . , X
X
X
n
X
n+1
.
.
.
n+k−1
= a
X
n−k
X
n−k+1
k
.
.
.
X
n−1
+
положим
k−1
ak− 1
c mod m, n = k, 2k, . . .
a − 1
В строке 3 создается имя для типа — вектора из четырех 32битных целых чисел со знаком. Для удобства обращения к каждому из
четырех чисел объявляется union i4vec в строках 5–8. Сам линейный
мультипликативный конгруэнтный генератор реализован в виде класса
lcr. Конструктор принимает в качестве аргумента значение X0и по-
следовательно вычисляет a mod m, a2mod m, a3mod m, a4mod m.
27

При компиляции арифметических и логических операций в строках 29
и 37 будут подставлены соответствующие низкоуровневые векторные
процессорные инструкции.
Алгоритм II
Второй векторный линейный конгруэнтный генератор с единым
набором параметров
Для заданного X0определим
X
1 # defin e a0 1 6 8 07
2
3 t ypede f in t v4 s i __at t r i but e _ _ (( v ect o r _ siz e ( 1 6 )));
4
5 u n i on i 4 v e c {
6 v4si v ;
7 in t i[4];
8 };
9
10 c l a ss l c r {
11 union i 4vec s eed , a ;
12 in t lo c ;
13 p u blic :
14 lc r ( in t _seed );
15 in t ne x t ( ) ;
16 };
17
18 l c r :: lcr ( int _ s e e d )
19 :loc (0 )
20 {
21 const v 4 s i m = {0 x7fffff f f ,0 x7ffff f f f ,
22 0 x 7 f f f f f ff , 0 x 7 ffff f f f } ;
X
n
X
n+1
.
.
.
n+k−1
= X
a
2
+
(a + 1)c
ak−1
a
.
n
.
.
k
a
a−1
c
.
.
.
mod m, n = k, 2k, . . .
c
Программа 2.1. Линейный конгруэнтный генератор
28

23 seed . i [ 0 ] = ( a0 * _se e d & 0 x 7 f f ffff f );
24 a. i [ 0 ] = a 0 ;
25 fo r ( in t j=1; j < 4 ; j ++) {
26 a.i [ 0 ] = (( a .i [ 0]* a 0 ) & 0 x 7 f ffff f f ) ;
27 seed . i[ j ]=( a 0 * s e e d . i [j - 1 ] & 0 x 7 f ffff f f ) ;
28 };
29 a. i [ 1 ] = a . i [ 2 ] = a . i [ 3 ] = a. i [0];
30 seed . v =( a .v * seed . v) & m;
31 };
32
33 i n line i n t lc r :: next () {
34 const u nion i 4 v ec m = {0 x 7fffffff ,0 x 7fffffff ,
35 0 x 7 f f f f f ff , 0 x 7 ffff f f f } ;
36 if (++ loc == 4 ) {
37 se e d .v = ( a. v * s e e d . v ) & m . v;
38 loc = 0;
39 };
40 retur n se e d . i [ loc ];
41 };
Возможность производить векторные операции приводит к следующей модификации линейного конгруэнтного генератора.
Алгоритм III
Второй векторный линейный конгруэнтный генератор с несколькими
наборами параметров
Пусть a1, a2, . . . , akи c1, c2, . . . , ck— наборы различных множителей и приращений; для заданных X0, X1, . . . X
X
X
n
X
n+1
.
.
.
n+k−1
a
a
=
a
1
X
2
.
.
.
k
X
n−k
n−k+1
.
.
.
X
n−1
c
1
c
2
mod m, n = k, 2k, . . . ,
.
.
.
c
m
+
определим
k−1
где обозначает поэлементное умножение двух векторов.

2.4. Обобщенный генератор Фибоначчи с запаздыванием
Обобщенный генератор Фибоначчи с запаздыванием задается со-
отношением
Xn= X
n−i
◦ X
mod m, n > max{i, j}, (2.3)
n−j
где ◦ означает некоторую бинарную арифметическую или логическую
операцию (например, сложение +, вычитание −, умножение ·, исключающее «или» ⊕). Параметры i, j называются запаздываниями. При
i = 1, j = 2 и ◦ в значении + получается собственно генератор Фибо-
наччи. При ◦ в значении + имеем генератор Фибоначчи с запаздыванием. Достоинствами обобщенных генераторов Фибоначчи с запаздыва-
нием является отсутствие умножений и возможность перейти к работе
с вещественными числами. По сравнению со сложением целых чисел
умножение целых чисел выполняется на современных компьютерах существенно медленнее. Пусть теперь операция ◦ означает сложение или
вычитание. Положим Un= Xn/m. Тогда, разделив обе части равенства
(2.3) на m, получим:
Un= {U
n−i
± U
}, n > max{i, j}, (2.4)
n−j
где {·} означает дробную долю указанного в скобках числа. Поскольку теперь значение Xnзависит от двух более ранних значений, период получающейся последовательности может оказаться больше m,
но не больше m2− 1. Например, если начальными значениями Xn,
n < max{i, j}, выбраны нули, то получается последовательность из
нулей и период оказывается равен единице.
Рассмотрим несколько подробней генератор вида (см. [47])
Xn= X
n−i
+ X
mod 2e, i < j. (2.5)
n−j
Пусть e = 1. Тогда значениями Xnбудут только 0 и 1, один двоичный
разряд. Для поддержания работы генератора в этом случае надо знать
ровно j последних значений последовательности. Это «внутреннее состояние» генератора занимает j бит и может принимать 2jразличных
значений. Одно из них, соответствующее ровно j нулям, дает тривиальную нулевую последовательность. Оказывается, что при j > 2 все
остальные 2j−1 значений циклически переходят одно в другое. Таким
образом, при e = 1 период равен 2j− 1.
30
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
