Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №0 Вариант 10.doc
Скачиваний:
15
Добавлен:
20.06.2014
Размер:
279.04 Кб
Скачать

Программирование датчика случайных чисел

Запрограммируем датчик случайных чисел для распределения Пуассона:

.

Алгоритм получения случайной величины, распределенной по закону Пуассона с параметром :

  1. реализуются последовательности независимых равномерно распределенных случайных величин на интервале [0,1);

  2. вычисляются произведения до тех пор, пока не выполнится условие

В качестве значения случайной величины Х принимается число n. Если неравенству удовлетворяет первое из равномерно распределенных чисел , то

s = 0.

В таблице 4 представлена сводная таблица результатов работы запрограммированного датчика случайных чисел с законом распределения Пуассона, запущенного со следующими параметрами: n=121, . Гистограмма, построенная по данной таблице приведена на рисунке 7.

Таблица 4. Результаты работы датчика случайных чисел

xi

0

1

2

3

4

5

6

7

8

ni

8

15

25

27

21

13

8

3

1

pi

0,0661

0,124

0,2066

0,2231

0,1736

0,1074

0,0661

0,0248

0,0083

Рисунок 7. Гистограмма сгенерированных значений.

Код программы на языке с с комментариями

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <time.h>

#include <math.h>

#include <locale.h>

int main(void)

{

const double e = 2.7182818; // число е

double proizv; // proizv - переменная для хранения произведений значений равномерно распред. СВ

double lambda; // значение параметра распред. Пуассона, задается пользователем.

int i = 0, puasson_value = 1, count; // i - счетчик сгенерированных чисел, puasson_value - сгенерированное число, count - количество чисел

setlocale(LC_ALL,"Russian");

printf("Введите параметр распределения лямбда: ");

scanf("%lf", &lambda);

printf("Введите количество генерируемых чисел: ");

scanf("%d", &count);

srand((unsigned)time(NULL)); // использовать системное время для начального значения равномерно распред. СВ

FILE *fp = fopen("output.txt", "w");

if(!fp) {

printf("При создании файла произошла ошибка!\n");

_getch();

return 1;

}

proizv = (double)rand()/RAND_MAX; // первое число равномерно распределенной СВ

while (i != count)

{

if (proizv <= pow(e,-lambda)) // алгоритм получения СВ по закону Пуассона

{

fprintf(fp, "%d\n", (puasson_value - 1)); // запись в файл найденного значения

i++;

puasson_value = 1; // очередное значение СВ, распределенной по закону Пуассона найдено, начать процедуру заново

proizv = (double)rand()/RAND_MAX;

}

else

{

proizv *= (double)rand()/RAND_MAX; // условие не выполнено, добавить еще один множитель равномерно распред. СВ

puasson_value++;

}

}

fclose(fp);

system("output.txt"); // открыть файл с сгенерированными числами для дальнейшей работы с ними

return 0;

}

Выводы по работе

В данной лабораторной работе был реализован алгоритм, позволяющий определить тип распределения по заданной выборке и сгенерировать по этому распределению новые значения. Также был реализован алгоритм программы, генерирующей случайные значения с определенным распределением.

Определенный тип распределения – распределение Пуассона, что было подтверждено критерием хи-квадрат. Довольно низкое значение критерия хи-квадрат позволяет судить о низком уровне зашумленности исходных данных. Сгенерированные программой значения имеют распределение Пуассона, что подтверждается гистограммой.