Программирование датчика случайных чисел
Запрограммируем датчик случайных чисел для распределения Пуассона:
.
Алгоритм получения случайной величины, распределенной по закону Пуассона с параметром :
-
реализуются последовательности независимых равномерно распределенных случайных величин на интервале [0,1);
-
вычисляются произведения до тех пор, пока не выполнится условие
В качестве значения случайной величины Х принимается число 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;
}
Выводы по работе
В данной лабораторной работе был реализован алгоритм, позволяющий определить тип распределения по заданной выборке и сгенерировать по этому распределению новые значения. Также был реализован алгоритм программы, генерирующей случайные значения с определенным распределением.
Определенный тип распределения – распределение Пуассона, что было подтверждено критерием хи-квадрат. Довольно низкое значение критерия хи-квадрат позволяет судить о низком уровне зашумленности исходных данных. Сгенерированные программой значения имеют распределение Пуассона, что подтверждается гистограммой.