Методы моделирования произвольно распределенных непрерывных псевдослучайных величин, страница 2

void met1(int x[dim])

{  int a,c;

int minim,maxim;

int m;

a=1; c=1; x[0]=0;

for (int i=0; i<dim; i++) x[i+1] = fmod(a*x[i]+c,m);

}

/***** factorial *****/

long double fact(int a)

{ long double f=1;

if(a>1) for (int i=2; i<=a; i++)  f = f*i;

return f;

}

/***** sochetanie *****/

double soch(int a,int b)

{ double s,f1,f2,f3;

f1=(double)fact(a);

f2=(double)fact(b-a);

f3=(double)fact(b);

s=f3/(f1*f2);

return s;

}

/***** P{x=i} *****/

double p(int i)

{  double a,b,c;

a=soch(i,k);

b=soch(n-i,N-k);

c=soch(n,N);

return (a*b/c);

}

/***** discret value *****/

void discet(int d[dim], int x[dim])

{int i,l;

double s,p1;

met1(x);

for(i=0;i<dim;i++)

{ l=1;

s=(double)x[i+1]/m-p(0);

while (s>0)

{ l++;  p1=p(l-1);

s=s-p1;

}

d[i]=x[l];

}

return;

}

/***** hi2 *****/

float hi2(int d[dim],int nyu[dim],double v[dim])

{double a,h=0.;

int l1,l2;

l1=n+k-N; if(l1<0) l1=0;

l2=n; if(l2>k) l2=k;

for( int l=l1;l<l2;l++)

{  nyu[l-l1]=0; v[l-l1]=0;

for (int i=0;i<n;i++)

if (d[i]=l)   { nyu[l-l1]++;

v[l-l1]=v[l-l1]+p(d[i]);

}

}

a=0;

for(int i=0;i<l2-l1;i++) a=a+v[i];

//  for(i=0;i<l2-l1;i++) v[i]=v[i]/a;

for(i=0;i<l2-l1;i++)

if (nyu[i]>0)

{ a=(double)(nyu[i]-dim*v[i])/a;

h=h+a*a/(dim*v[i]);

}

nnn=l2-l1;

return h;

}

///////////////////////////////////////////

main()

{ int x[dim],d[dim],nyu[dim];

double v[dim];

double ma,da,ro,h;

clrscr();

ofstream out1("rez.dat");

/*  cout<<"N = "; cin>>N;

cout<<"n = "; cin>>n;

cout<<"k = "; cin>>k;  */

N=50;//k=20;

for(k=6;k<=44;k++)

for(n=6;n<=44;n++)

{// n=k-1;

discet(d,x);

ofstream out("discret.dat");

for(int i=0;i<dim;i++) out<<d[i]<<"\n";

out.close();

h=hi2(d,nyu,v);

ro=(double)(N-n)/n;

ma=(double)n/(1+ro);

da=(double)n*ro*ro/pow(1+ro,3);

out1<<"h = "<<(h-ma)/da<<"  n= "<<n<<" k= "<<k<<" nnn "<<nnn<<"\n";

}

return 0;

}

Выполнение лабораторной работы №3

Методы моделирования произвольно распределенных непрерывных псевдослучайных величин

Цель работы:

Изучение методов, разработка алгоритмов и программ программной имитации непрерывных псевдослучайных величин с произвольным законом распределения. Статический анализ качества псевдослучайных последовательностей.

Задание

1.   Найти методом обратной функции моделирующее выражение для случайной величины x, имеющей следующую плотность распределения:

f(x)=C exp( -lx )          xÎ(0;¥)

2.   Найти моделирующее выражение для случайной величины x, имеющей следующую плотность распределения, по методу обратной функции, когда моделирующая функция немонотонна

f(x)=C x ( 1+x )2          xÎ(0;1)

3.   Написать алгоритм моделирования случайной величины x, распределенной с плотностью f(x), с использованием порядковых статистик:

f(x)=4 (1 - x )3             xÎ(0;1)

4.   Написать алгоритм моделирования случайной величины x с плотностью распределения:

f(x)=C x exp( ax )         xÎ(0;b)

5.   Написать алгоритм моделирования случайной величины x со следующей плотностью распределения по методу суперпозиции:

f(x)=åan xn                  xÎ(0;1)

6.   Написать алгоритм моделирования случайной величины x со следующей плотностью распределения по методу исключения:

f(x)=C x5/3exp( -x)       xÎ(0;b)

 Моделирование непрерывных случайных величин.

1. стандартный метод, метод обратной функции