Генератор равномерных случайных величин по технологии полного вихревого массива
ISSN 0236-3933. Вестник МГТУ им. Н.Э. Баумана. Сер. Приборостроение. 2017. № 2
87
Согласно технологии конгруэнтной генерации, каждая следующая случай-
ная величина
+
1
i
x
создается на основе текущей случайной величины
i
x
с помо-
щью ограниченного функционального преобразования
( )
+
=
1
.
i
i
x f x mod m
(1)
Модуль
mod m
определяет интервал
−
0,
1
m
генерируемых величин. Ис-
торически функция
( )
i
f x
выбиралась как линейное алгебраическое преобра-
зование
( )
= +
.
i
i
f x ax c
(2)
Константные коэффициенты
a
и
c
подбираются согласно свойствам проек-
тируемого генератора. Поясним это на примере технологии генерации несколь-
ких
N
= 8 случайных величин из небольшого интервала
0, 7 .
Выбор малой
длины интервала не нарушает общности исследования, но позволяет представ-
лять результаты более очевидно в простой наглядной форме. В качестве началь-
ного значения возьмем
∈ ⊂
0
1, 7 0, 7 .
x
Также примем во внимание все слу-
чайные последовательности при различных
∈ =
1, 7
a A
и
∈ =
0, 7 .
c C
Та-
ким образом, общее число возможных комбинаций
a, c, x
обозначим как
( )
( ) (
)
=
⋅
⋅
− = ⋅ ⋅ =
1 7 8 7 392.
NN card A card C N
Теперь добавим в компьютерную программу функцию
Repeating()
, которая
возвращает истинное значение
true
, если любой элемент
x
из 0, 1, …, 7 имеет
повторение в случайной последовательности из восьми чисел. Этот подход по-
могает определить конгруэнтную равномерную полноту, реально перебрав все
возможные значения:
=
/ ,
CC r NN
где
r
— число равномерных случайных последовательностей, a
NN
— общее
число последовательностей.
Далее приведен программный код на диалекте C# [18] среды Visual Studio 2015
Microsoft, хотя подобный код можно было бы изложить на историческом C (диа-
лект Win32) или C++ (диалект CLR). В любом варианте результат одинаковый.
static void Main( string[] args )
{ int N = 8; // длина последовательности
Console.WriteLine("N = {0}", N);
int NN = 0; // общее число последовательностей
int m = N; // модуль конгруэнтности
int r = 0; // номер равномерной последовательности
int[] x = new int[N]; // случайная последовательность
for ( int a = 1; a < N; a++ )
for ( int c = 0; c < N; c++ )
for ( int x0 = 1; x0 < N; x0++ )
{ x[0] = x0; // начало последовательности