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

Полное факториальное моделирование равномерных последовательностей…

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++)