Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Получение на ЭВМ равномерно распределенных псевдослучайных чисел. Отчет.doc
Скачиваний:
39
Добавлен:
25.05.2014
Размер:
162.3 Кб
Скачать

Тест проверки равномерности закона распределения

Данный тест строится на основе применения критерия согласия . Пусть имеется выборка 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();

}