Тест проверки равномерности закона распределения
Данный тест строится на основе применения критерия согласия . Пусть имеется выборка 1, 2, ,N псевдослучайных чисел в интервале ( 0, 1 ). Интервал ( 0, 1 ) изменения случайной величины разбивается на m интервалов хj, j = 1, 2, , m, очевидно, что хm = 1, а нижняя граница первого интервала равна нулю. Обычно принимают m = 10 20.
Далее производится определение вероятности pj попадания случайной вели-чины в j-й интервал. Для равномерного на интервале ( 0, 1 ) закона распределения pj = xj - xj-1. Затем определяется величина , j = 1, 2, ,m - число попаданий случайной величины в j-й интервал и подсчитывается величина
распределенная по закону с ( m-1 ) степенью свободы. По заданному уровню значимости путем решения уравнений ( 9 ) и ( 10 ) ( с помощью таблицы, приведенной в приложении А ) можно определить нижнюю и верхнюю границы доверительного интервала. Если подсчитанное значение не попадает в доверительный интервал, то гипотезу о равномерном законе распределения случайной величины следует отвергнуть.
Дополнительно можно подсчитать эмпирическое математическое ожидание
( 15 )
и эмпирическую дисперсию
( 16 )
и сравнить их с теоретическими значениями соответственно 0.5 и 1 / 12.
Тесты проверки независимости последовательности
псевдослучайных чисел
В основе этих методов лежит представление полученных псевдослучайных чисел в качестве реализации дискретного стационарного случайного процесса х ( t ).
Для количественной оценки степени некоррелированности последовательности псевдослучайных чисел 1, 2, ,N применяется способ, заключающийся в определении коэффициента корреляции ( i,i ) между элементом i последователь-ности и его номером i:
( 19 )
Если при заданном уровне значимости
где max - верхняя граница доверительного интервала, а z определяется из уравнения:
2Ф ( z ) = ,
то считается, что имеет место корреляционная связь между псевдослучайными числами. В противном случае можно принять гипотезу об их независимости
Текст программ.
Метод середины произведения
#include<stdio.h>
#include<math.h>
#include<iostream.h>
#include<conio.h>
void main()
{ clrscr();
double x0=0.0051,x1=0.1232;
for(int i=0;i<20;i++)
{double cel;
double dr=modf(1000000*x0*x1, &cel);
dr=modf(cel*0.0001, &cel);
x0=x1;
x1=dr;
cout<<x1<<endl;
}
}
Мультипликативный метод
#include<stdio.h>
#include<math.h>
#include<iostream.h>
#include<conio.h>
int bin(int a)
{ int b=0;
int tem=a;
for(int j=0;j<5;j++)
{
b=b+(tem%2)*pow(10,j);
tem=tem/2;
}
return b;
}
int dec(int a)
{ int b=0;
int tem=a;
for(int j=0;j<5;j++)
{
b=b+(tem%10)*pow(2,j);
tem=tem/10;
}
return b;
}
void main()
{
clrscr();
int l,x0=17,t=3;
double cel;
l=8*t-3;
for (int i=0;i<20;i++)
{
int X1=bin(l*x0);
x0=dec(X1);
cout<<dec(X1)/32.0<<endl;
}
}
Тест проверки равномерности закона распределения и Тесты проверки независимости последовательности псевдослучайных чисел для метода середины произведения
#include<stdio.h>
#include<math.h>
#include<iostream.h>
#include<conio.h>
const int N=20;
void main()
{ clrscr();
double x0=0.0051,x1=0.1232;
// int tmp1,tmp2;float x;
float X[21];
for(int i=0;i<20;i++)
{double cel;
double dr=modf(1000000*x0*x1, &cel);
dr=modf(cel*0.0001, &cel);
x0=x1;
x1=dr;
X[i]=x1;
cout<<x1<<endl;
}
//test proverki ravnomernosti
float epssr=0,X2=0,a=0,b=0,pj;
for(int j=0;j<m;j++)
{a=b;
b=b+1.0/m;
pj=b-a;
int vj=0;
for(int i=0;i<20;i++)
{
if(X[i]>a)if(X[i]<b) vj++;
epssr+=X[i];
}
X2+=pow(vj-pj*20,2)/(pj*20);
epssr/=20;
}
float s2=0;
for(i=0;i<20;i++)
s2+=pow(X[i]-epssr,2);
s2/=19;
cout<<X2<<" "<<epssr<<" "<<s2<<endl;
//test proverki nezavisimosti posledovatelnosti
float ro=0;
float iepsi=0,eps2=0,epsi=0;
for(i=0;i<N;i++)
{
iepsi+=X[i]*i;
eps2+=pow(X[i],2);
epsi+=X[i];
}
ro=(iepsi/N-(epsi/N)*(N+1)/2)/sqrt((eps2/N-pow(epsi/N,2))*((N*N-1)/12));
cout<<ro<<" ";
float romax=0,zbet=1.95;
romax=zbet*((1-ro*ro)/sqrt(N));
cout<<romax<<endl;
if(abs(ro)>romax) ;
getch();
}
Тест проверки равномерности закона распределения и Тесты проверки независимости последовательности псевдослучайных чисел для мультипликативного метода
#include<stdio.h>
#include<math.h>
#include<iostream.h>
#include<conio.h>
int bin(int a)
{ int b=0;
int tem=a;
for(int j=0;j<5;j++)
{
b=b+(tem%2)*pow(10,j);
tem=tem/2;
}
return b;
}
int dec(int a)
{ int b=0;
int tem=a;
for(int j=0;j<5;j++)
{
b=b+(tem%10)*pow(2,j);
tem=tem/10;
}
return b;
}
void main()
{
clrscr();
int l,x0=17,t=3;
double cel, X[21];
l=8*t-3;
for (int i=0;i<20;i++)
{
int X1=bin(l*x0);
x0=dec(X1);
X[i]= dec(X1)/32.0;
cout<<dec(X1)/32.0<<endl;
}
//test proverki ravnomernosti
float epssr=0,X2=0,a=0,b=0,pj;
for(int j=0;j<m;j++)
{a=b;
b=b+1.0/m;
pj=b-a;
int vj=0;
for(int i=0;i<20;i++)
{
if(X[i]>a)if(X[i]<b) vj++;
epssr+=X[i];
}
X2+=pow(vj-pj*20,2)/(pj*20);
epssr/=20;
}
float s2=0;
for(i=0;i<20;i++)
s2+=pow(X[i]-epssr,2);
s2/=19;
cout<<X2<<" "<<epssr<<" "<<s2<<endl;
//test proverki nezavisimosti posledovatelnosti
float ro=0;
float iepsi=0,eps2=0,epsi=0;
for(i=0;i<N;i++)
{
iepsi+=X[i]*i;
eps2+=pow(X[i],2);
epsi+=X[i];
}
ro=(iepsi/N-(epsi/N)*(N+1)/2)/sqrt((eps2/N-pow(epsi/N,2))*((N*N-1)/12));
cout<<ro<<" ";
float romax=0,zbet=1.95;
romax=zbet*((1-ro*ro)/sqrt(N));
cout<<romax<<endl;
if(abs(ro)>romax) ;
getch();
}