Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа5

.docx
Скачиваний:
9
Добавлен:
17.06.2021
Размер:
96.15 Кб
Скачать

Министерство образования и науки РФ

Федеральное государственное бюджетное образовательное учреждение высшего образования

«Омский государственный технический университет»

Кафедра «Комплексная защита информации»

Отчёт по лабораторной работе № 5

по дисциплине

«Математические модели в информационных системах»

Выполнил

Студент гр. ИВТм-192

Козлитин Ю.В. ______________

(подп., дата)

Проверил

Профессор каф. КЗИ

Магазев А.А ______________

(подп., дата)


Омск, 2019

Задание: разработать программу, реализующую генератор зависимых нормально распределенных случайных величин на основе центральной предельной теоремы.

Ход выполнения работы

Генератор случайных чисел работает по следующему алгоритму:

  1. С помощью центральной предельной теоремы генерируется величина x, распределенная нормально с .

  2. Вычисляются математическое ожидание и среднеквадратическое отклонение зависимой случайной величины по формулам:

.

  1. Далее снова генерируется нормальная случайная величина y с и .

  2. Коэффициент корреляции полученных величин x и y – .

Код программы, реализующей вышеописанный алгоритм, показан в листинге А.

На рисунке 1 показана координатная плоскость, координаты точек которой соответствуют значениям x и y. = 1, = 3, Было сгенерировано 1000 пар значений x и y.

Далее были получены эмпирические значения математических ожиданий, стандартного отклонения и коэффициента корреляции для выборок, сгенерированных генератором со входными параметрами: = 1, = 3, Расчетные значения близки к исходным:

Расчёты ковариации и коэффициент корреляции осуществляются формулами:

Covxy = M[(x – M[x])(y-M[y])];

Двумерное нормальное распределение:

Рисунок 1 – Диаграмма рассеяния для

На рисунке 2 показана диаграмма рассеяния для тех же значений , ,

Рисунок 2 – Диаграмма рассеяния для

Заключение

Был изучен способ генерации зависимых случайных величин, подчиняющихся нормальному закону распределения при помощи центральной предельной теоремы.

Приложение А Исходный код программы

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Text;

namespace NormalGenerator

{

class Generator

{

public Generator (int a = 421, int b = 54773, int generatorModule = 259200, int intervalCount = 100)

{

this.a = a;

this.b = b;

this.generatorModule = generatorModule;

k = intervalCount;

}

public void check(IEnumerable<List<double>> values, string statisticsFile, string resultsFile)

{

var numbers = values.ToList();

var numbersX = numbers[0];

var numbersY = numbers[1];

double minValueX = getMinValue(numbersX);

double maxValueX = getMaxValue(numbersX);

double minValueY = getMinValue(numbersY);

double maxValueY = getMaxValue(numbersY);

double deltaX = maxValueX - minValueX;

double deltaY = maxValueY - minValueY;

Dictionary<int, int> amountOfNumberPerSquare = new Dictionary<int, int>();

Dictionary<int, int> amountOfNumberX = new Dictionary<int, int>();

Dictionary<int, int> amountOfNumberY = new Dictionary<int, int>();

FileStream fs = new FileStream(statisticsFile, FileMode.Create, FileAccess.ReadWrite);

StreamWriter sw = new StreamWriter(fs);

double stepX = deltaX / k;

double stepY = deltaY / k;

for (int i = 0; i < k; i++)

{

amountOfNumberPerSquare.Add(i, 0);

amountOfNumberX.Add(i, 0);

amountOfNumberY.Add(i, 0); }

for (int step = 0; step < k; step++)

{

for(int i = 0; i<numbersX.Count; i++)

{

double numX = numbersX[i];

double numY = numbersY[i];

bool isInXInterval = numX > minValueX + step * stepX && numX < minValueX + (step + 1) * stepX;

bool isInYInterval = numY > minValueY + step * stepY && numY < minValueY + (step + 1) * stepY;

if (isInXInterval && isInYInterval)

amountOfNumberPerSquare[step]++;

if (isInXInterval)

amountOfNumberX[step]++;

if (isInYInterval)

amountOfNumberY[step]++;

}

}

int count = 0;

FileStream fs2 = new FileStream(resultsFile, FileMode.Create, FileAccess.ReadWrite);

StreamWriter sw2 = new StreamWriter(fs2);

for (int i = 0; i < numbersX.Count; i++)

{

double numX = numbersX[i];

double numY = numbersY[i];

int step = (int)Math.Floor((numX - minValueX) / stepX);

// double probability = (double)amountOfNumberPerSquare[step > 99 ? 99 : step] / numbersX.Count;

// sw2.WriteLine($"{numX};{numY};{probability}");

sw2.WriteLine($"{numX};{numY}");

}

sw2.Close();

fs2.Close();

sw.Close();

fs.Close();

}

private double getMinValue(List<double> numbers)

{

double minValue = double.MaxValue;

foreach (double num in numbers)

{

if (num < minValue)

minValue = num;

}

return minValue;

}

private double getMaxValue(List<double> numbers)

{

double maxValue = double.MinValue;

foreach (double num in numbers)

{

if (double.IsFinite(num) && num > maxValue)

maxValue = num;

}

return maxValue;

}

private int a, b, generatorModule, k;}}