Лабораторная работа5
.docx
Министерство образования и науки РФ
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Омский государственный технический университет»
Кафедра «Комплексная защита информации»
Отчёт по лабораторной работе № 5
по дисциплине
«Математические модели в информационных системах»
|
Выполнил Студент гр. ИВТм-192Козлитин Ю.В. ______________(подп., дата)ПроверилПрофессор каф. КЗИМагазев А.А ______________(подп., дата) |
Омск, 2019
Задание: разработать программу, реализующую генератор зависимых нормально распределенных случайных величин на основе центральной предельной теоремы.
Ход выполнения работы
Генератор случайных чисел работает по следующему алгоритму:
С помощью центральной предельной теоремы генерируется величина x, распределенная нормально с .
Вычисляются математическое ожидание и среднеквадратическое отклонение зависимой случайной величины по формулам:
.
Далее снова генерируется нормальная случайная величина y с и .
Коэффициент корреляции полученных величин 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;}}