Previous Page  2 / 25 Next Page
Information
Show Menu
Previous Page 2 / 25 Next Page
Page Background

Генератор равномерных случайных величин по технологии полного вихревого массива

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; // начало последовательности