- •Лаба 1 Теоретическая часть о случайных и псевдослучайных числах
- •Часть 1. Генератор равномерно распределенных псевдослучайных чисел
- •Часть 2. Генераторы псевдослучайных чисел, распределенных по различным законам распределения
- •Задание к первой части
- •Задание ко второй части
- •Лаба2 Краткая теоретическая часть
Лаба2 Краткая теоретическая часть
Проверка статистических гипотез заключается в том, что необходимо подтвердить или опровергнуть утверждение, что заданная выборка из элементов принадлежит некоторому распределению с заданным параметром, который показывает вероятностную ошибку. Для датчиков псевдослучайных чисел это означает, что нужно определить, будет ли генерируемая ими последовательность значений принадлежать соответствующему закону распределения.
Существует не один десяток критериев проверки гипотез. Наиболее популярные из них следующие: критерий согласия , критерий Крамера-фон Мизеса, критерий Колмогорова-Смирнова. В данной лабораторной работе мы будем использовать последний критерий.
Критерий Колмогорова-Смирнова хорошо зарекомендовал себя для выборок объемом от 10 до 100 элементов. Он применяется в тех случаях, когда проверяемое распределение непрерывно и известно среднее значение и дисперсия проверяемой совокупности.
Для проверки гипотезы по критерию Колмогорова-Смирнова необходимо подготовить исходные данные, которые можно собрать в таблице следующего вида.
Табл. 1. Исходные данные для проверки гипотезы по критерию Колмогорова-Смирнова
Событие |
Наблюд-я частота |
Наблюд-я вер-ть |
Теор-я вер-ть |
Наблюд-е распр-е |
Теор-е распр-е |
Абсол-я разность |
В таблице использованы следующие значения:
- полученное датчиком псевдослучайное число;
- количество интервалов разбиения исходного отрезка- количество рассматриваемых событий;
- интервал, которому принадлежит. Объединение интервалов длядолжно быть равно.
- абсолютная наблюдаемая частота; показывает, сколько раз произошло событие;
- относительная наблюдаемая частота;
- вычисляется как определенный интеграл функции плотности вероятностей по отрезку.
Из полученной таблицы в последней колонке необходимо взять наибольшую абсолютную разность . Данное значение проверяется с соответствующим критическим значением для заданной вероятностной ошибки-. Если, то гипотеза верна, в противном случае – нет.
Ниже приведена таблица Критических чисел Колмогорова-Смирнова.
Степень свободы (объем выборки) | |||
0,10 |
0,05 |
0,01 | |
1 |
0,950 |
0,975 |
0,995 |
2 |
0,776 |
0,842 |
0,929 |
3 |
0,642 |
0,708 |
0,828 |
4 |
0,564 |
0,624 |
0,733 |
5 |
0,510 |
0,565 |
0,669 |
6 |
0,470 |
0,521 |
0,618 |
7 |
0,438 |
0,486 |
0,577 |
8 |
0,411 |
0,457 |
0,543 |
9 |
0,388 |
0,432 |
0,514 |
10 |
0,368 |
0,410 |
0,490 |
11 |
0,352 |
0,391 |
0,468 |
12 |
0,338 |
0,375 |
0,450 |
13 |
0,325 |
0,361 |
0,433 |
14 |
0,314 |
0,349 |
0,418 |
15 |
0,304 |
0,338 |
0,404 |
16 |
0,295 |
0,328 |
0,392 |
17 |
0,286 |
0,318 |
0,381 |
18 |
0,278 |
0,309 |
0,371 |
19 |
0,272 |
0,301 |
0,363 |
20 |
0,264 |
0,294 |
0,356 |
25 |
0,240 |
0,270 |
0,320 |
30 |
0,220 |
0,240 |
0,290 |
35 |
0,210 |
0,230 |
0,270 |
Более 35 |
Реализация:
#include "stdafx.h"
#include "conio.h"
#include "math.h"
double rundum (long b){
long y;
double r;
y = b*1220703125;
if (y < 0){
y+=1073741824;
y+=1073741824;
};
r = y*0.4656613/1000000000;
return r;
};
void rm (void){
//количество рассчитанных случайных чисел
double x[1000];
//границы интервалов для равномерного распределения
double m[2][10] = {{0.0,0.1,0.15,0.20,0.21,0.3,0.46,0.64,0.7,0.91},{0.1,0.15,0.20,0.21,0.3,0.46,0.64,0.7,0.91,1}};
//сколько раз попадает в каждый интервал
int p[10] = {0,0,0,0,0,0,0,0,0,0};
//относительная частота попадания
double pp[10];
//значение определенного интеграла функции плотности вероятности
double ppp[10];
//абсолютная разность
double delta[10];
//максимум по дельтам
double max_delta;
double alfa[3]={0.368,0.41,0.49};
for (int i = 0; i < 1000; i++){
x[i] = rundum(i+267);
};
for (int i = 0; i < 1000; i++){
for (int j = 0; j < 10; j++){
if (x[i] >= m[0][j] && x[i] < m[1][j]){
p[j] = p[j] + 1;
};
};
};
for (int i=0; i<10; i++){
pp[i]=p[i]*0.001;
ppp[i]=abs(m[1][i]-m[0][i]);
delta[i] = abs(ppp[i]-pp[i]);
};
max_delta = delta[0];
for (int i=0; i<10; i++){
if (delta[i]>max_delta) max_delta=delta[i];
};
printf ("Ravnomernoe:\nnum\tdlina\tn_ver\t\tt_ver\t\tdelta\n");
for (int i = 0; i < 10; i++){
printf ("%d\t%g\t%f\t%f\t%f\n", i,abs(m[1][i]-m[0][i]) ,pp[i],ppp[i],delta[i]);
};
printf("\nNaibolshee otklonenie: %f\n\n",max_delta);
for (int i=0;i<3;i++){
if (max_delta<alfa[i]){
printf("dlja alfa = %g gipoteza verna\n",alfa[i]);
};
};
};
void norm (void){
//количество рассчитанных случайных чисел
double x[100];
//границы интервалов для равномерного распределения
double m[2][100];
//сколько раз попадает в каждый интервал
int p[100];
//переменные для накопления суммы, мат ожидание, дисперсия
double a=0, M=0.5, D=0.15;
//массив с нормально распределенными числами
double s[1000];
//относительная частота попадания
double pp[100];
//значение определенного интеграла функции плотности вероятности
double ppp[100];
//абсолютная разность
double delta[10];
//максимум по дельтам
double max_delta;
double dop_pp[10];
double dop_ppp[10];
int i_min, i_max;
double alfa[3]={0.368,0.41,0.49};
for (int i=0; i<100; i++){
p[i] = 0;
ppp[i] = 0;
};
for(int i=0; i<10; i++){
dop_pp[i] = 0;
dop_ppp[i] = 0;
};
//расчет чисел и заполнение массива
for (int j=0; j<1000; j++){
for (int i = 0; i < 100; i++){
x[i] = rundum(i*j+834);
a += x[i];
};
s[j] = M+(a-50)*D;
a=0;
}
//расчет границ интервалов
m[0][0] = 0;
m[1][99] = 1;
double shag;
shag = (m[1][99]-m[0][0])/100;
for (int i=1; i<100; i++){
m[0][i]=m[0][i-1]+shag;
};
for (int i=98; i>=0; i--){
m[1][i]=m[1][i+1]-shag;
};
//подсчет сколько чисел попадает в каждый интервал
for (int i = 0; i < 100; i++){
for (int j = 0; j < 1000; j++){
if (s[j] >= m[0][i] && s[j] < m[1][i]){
p[i] = p[i] + 1;
};
};
};
for (int i=0; i<100; i++){
pp[i] = p[i]*0.001;
};
for (int i=0; i<99; i++){
ppp[i]=abs(m[1][i]-m[0][i])*0.5*(pp[i]+pp[i+1]);
};
ppp[99]=abs(m[1][99]-m[0][99])*pp[99];
for (int i=0; i<10; i++){
i_min = i*10;
i_max = (i+1)*10;
for (int j=0; j<100; j++){
if (j>=i_min && j<i_max){
dop_pp[i]=dop_pp[i]+pp[j]*0.01;
dop_ppp[i]=dop_ppp[i]+ppp[j];
};
};
};
for (int i=0; i<10; i++){
delta[i] = abs(dop_ppp[i]-dop_pp[i]);
};
max_delta = delta[0];
for (int i=0; i<10; i++){
if (delta[i]>max_delta) max_delta=delta[i];
};
printf ("Normalnoe:\nnum\tdlina\tn_ver\t\tt_ver\t\tdelta\n");
for (int i = 0; i < 10; i++){
printf ("%d\t%g\t%f\t%f\t%f\n", i,abs(m[1][i]-m[0][i]),dop_pp[i],dop_ppp[i],delta[i]);
};
printf("\nNaibolshee otklonenie: %f\n\n",max_delta);
for (int i=0;i<3;i++){
if (max_delta<alfa[i]){
printf("dlja alfa = %g gipoteza verna\n",alfa[i]);
};
};
};
void exp (void){
//массив экспотенциально распределенных случайных чисел
double x[1000];
//границы интервалов для равномерного распределения
double m[2][100];
//сколько раз попадает в каждый интервал
int p[100];
//переменные для накопления суммы, мат ожидание, дисперсия
double a=0, M=0.5, D=0.15;
//относительная частота попадания
double pp[100];
//значение определенного интеграла функции плотности вероятности
double ppp[100];
//абсолютная разность
double delta[10];
//максимум по дельтам
double max_delta;
double dop_pp[10];
double dop_ppp[10];
int i_min, i_max;
double alfa[3]={0.368,0.41,0.49};
for (int i=0; i<100; i++){
p[i] = 0;
ppp[i] = 0;
};
for(int i=0; i<10; i++){
dop_pp[i] = 0;
dop_ppp[i] = 0;
};
//расчет и заполнение массива
for (int i = 0; i < 1000; i++){
x [i] = -log(rundum(i+67))*M;
};
//расчет границ интервалов
m[0][0] = 0;
m[1][99] = 1;
double shag;
shag = (m[1][99]-m[0][0])/100;
for (int i=1; i<100; i++){
m[0][i]=m[0][i-1]+shag;
};
for (int i=98; i>=0; i--){
m[1][i]=m[1][i+1]-shag;
};
//подсчет сколько чисел попадает в каждый интервал
for (int i = 0; i < 100; i++){
for (int j = 0; j < 1000; j++){
if (x[j] >= m[0][i] && x[j] < m[1][i]){
p[i] = p[i] + 1;
};
};
};
for (int i=0; i<100; i++){
pp[i] = p[i]*0.001;
};
for (int i=0; i<99; i++){
ppp[i]=abs(m[1][i]-m[0][i])*0.5*(pp[i]+pp[i+1]);
};
ppp[99]=abs(m[1][99]-m[0][99])*pp[99];
for (int i=0; i<10; i++){
i_min = i*10;
i_max = (i+1)*10;
for (int j=0; j<100; j++){
if (j>=i_min && j<i_max){
dop_pp[i]=dop_pp[i]+pp[j]*0.01;
dop_ppp[i]=dop_ppp[i]+ppp[j];
};
};
};
for (int i=0; i<10; i++){
delta[i] = abs(dop_ppp[i]-dop_pp[i]);
};
max_delta = delta[0];
for (int i=0; i<10; i++){
if (delta[i]>max_delta) max_delta=delta[i];
};
printf ("Expotencialnoe:\nnum\tdlina\tn_ver\t\tt_ver\t\tdelta\n");
for (int i = 0; i < 10; i++){
printf ("%d\t%g\t%f\t%f\t%f\n", i,abs(m[1][i]-m[0][i]),dop_pp[i],dop_ppp[i],delta[i]);
};
printf("\nNaibolshee otklonenie: %f\n\n",max_delta);
for (int i=0;i<3;i++){
if (max_delta<alfa[i]){
printf("dlja alfa = %g gipoteza verna\n",alfa[i]);
};
};
};
int _tmain(int argc, _TCHAR* argv[])
{
rm();
norm();
exp();
getchar();
return 0;
}
Результат:
Вывод:критические значения для заданной вероятностной ошибкине превосходят табличных допустимых значений, следовательно гипотеза подтверждена.