Полное факториальное моделирование равномерных последовательностей…
ISSN 0236-3933. Вестник МГТУ им. Н.Э. Баумана. Сер. Приборостроение. 2017. № 5
133
if (!generate)
return z1 * sigma + mu;
double u1, u2;
do
{
u1 = rand() * (1.0 / RAND_MAX);
u2 = rand() * (1.0 / RAND_MAX);
}
while ( u1 <= epsilon );
z0 = sqrt(-2.0 * log(u1)) * cos(two_pi * u2);
z1 = sqrt(-2.0 * log(u1)) * sin(two_pi * u2);
Здесь значения
z0
и
z1
являются нормальными случайными величинами, кото-
рые получены с помощью равномерных случайных величин
u1
и
u2
из полуот-
крытого интервала (0, 1]. В качестве генератора равномерных случайных вели-
чин может выступать стандартная функция
rand()
среды
Microsoft Visual Stu-
dio
различных выпусков. Непосредственная проверка равномерности функции
rand()
показывает, что получаемые случайные величины
u1
и
u2
не обладают
высоким качеством, допуская пропуск и повторяемость генерируемых величин.
Программный код
H0101
на историческом языке программирования C, в кото-
ром моделируются 32 767 целых случайных величин, представлен ниже. Генера-
тор
rand()
создает целые случайные величины из интервала
0 : 32767 .
Вы-
полним 32 767 генераций и посмотрим, сколько раз будет создана любая слу-
чайная величина:
// H0101 C
// Тестирование rand()
#include <conio.h> // _getch
#include <iostream>
using namespace std; // cout
#include <iomanip> // setw
#include <stdlib.h> // srand, rand
#include <time.h> // time
void main()
{ int w = 15; // битовая длина случайной величины
int N1 = (int)(0xFFFFFFFF >> (32 - w)); // максимум
cout << "w = " << w << " N1 = " << N1 << endl;
int* c = new int[N1 + 1]; // массив счетчиков
int n1 = 0; // нижняя грань случайных величин
int n2 = N1; // верхняя грань случайных величин
cout << "n1 = " << n1 << " n2 = " << n2 << endl;
for (int j = 0; j <= N1; j++) c[j] = 0;
srand((unsigned int)time(NULL)); // начальное число
for (int k = 0; k <= N1; k++)
{
int v = rand();
if (n1 <= v && v < n2) c[v - n1]++;
}
int q0 = 0, q1 = 0, q2 = 0, q3 = 0;
for (int j = 0; j <= N1; j++)