Скачиваний:
93
Добавлен:
15.06.2014
Размер:
74.49 Кб
Скачать

Лабораторная работа №2, 3

Вариант 1

Выполнили:

ст. гр.

Задание:

В банк данных, состоящий из двух баз данных (БД1 и БД2), поступают запросы. Время обработки поступившего запроса – экспоненциальная случайная величина со средним значением 15 мс. Затем выполняется поиск запрашиваемой информации в БД1, а если она там не обнаруживается – то в БД2. Информация в БД1 обнаруживается примерно для 60% запросов; для остальных запросов она обнаруживается в БД2. Время поиска информации в каждой из баз данных – случайная величина, распределенная по экспоненциальному закону, со средним значением 30 мс. Примерно в 30% случаев объём ответа составляет ровно 300 символов, в 10% – рóвно 6000 символов. В остальных случаях объём ответа – случайная величина (V); на основании наблюдений установлено, что плотность распределения этой величины может быть приближённо задана графиком на рисунке 1.

Рисунок 1

Скорость формирования ответа – 6 мс на каждые 80 символов.

Требуется определить:

– среднее время ответа;

– вероятность того, что время ответа превысит 100 мс.

Код (С#):

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace IMC_2 { class Program { private const int Mo1 = 15; private const int Mo2 = 30; private const double SearchD1 = 0.6; private const int ForCounter = 100000; static void Main(string[] args) { for (var j = 0; j < 3; j++) { var counter = 0; var allTime = new double(); for (var i = 0; i < ForCounter; i++) { var time = new double(); var rnd = new Random(); time += Expon(Mo1); if (rnd.NextDouble() <= SearchD1) { time += Expon(Mo2); } else { time += Expon(Mo2) + Expon(Mo2); } var rnd1 = new Random(); double y = 0; var rndNumber = rnd1.NextDouble(); allTime = AllTime(rnd1, allTime, time, rndNumber, y, ref counter); } Console.WriteLine(String.Format("Avg answer time: {0}", allTime / ForCounter)); var probability = (double)counter / ForCounter; Console.WriteLine(String.Format("Probability: {0}%", probability * 100));  } } private static double AllTime(Random rnd1, double allTime, double time, double rndNumber, double y, ref int counter) { if (rndNumber < 0.1) { y = 300; time += (y/80)*6; } if (rndNumber >= 0.7) { y = 6000; time += (y/80)*6; } else { if (rndNumber > 0.1) { rndNumber = rnd1.NextDouble(); if (rndNumber < 0.1) { y = (rndNumber + 0.3)/0.0002; } if (rndNumber >= 0.1 && rndNumber < 0.5) { y = (rndNumber + 0.9)/0.0005; } if (rndNumber >= 0.5) { y = (rndNumber + 0.2)/0.00025; } time += (y/80)*6; allTime += time; if (time >= 100) { counter++; } } } return allTime; } private static double Expon(int mo) { var rnd = new Random(); return mo * Math.Log(rnd.NextDouble()); } } }

Пример результата:

Для 1000000 испытаний:

Для 10000 испытаний:

Соседние файлы в папке laby