Добавил:
yermolenkoigor9
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 100000//повторы эксперимента для дисперсии
#define nn 100//количество столбиков
#define s 2
// Минимальный компактный генератор случайных чисел Парка и Миллера
// константы Льюиса-Гудмана-Миллера */
#define IA 16807
#define IM 2147483647
#define AM (1./IM)
// константы Шаржа
#define IQ 127773
#define IR 2836
// маска чтоб не мешались нули
#define MASK 123456789
// числa Бейса-Дурхема
#define NTAB 32
#define NWUP 8
#define NDIV (1+(IM-1)/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)
static long dummy;
// начальное значение для всех генераторов
void Seed(long dum) {dummy=dum;}
// возвращает случайное число на промежутке от 0 до 1
float unirand0(void) {
long k;
float ans;
dummy^=MASK;// избегаем dummy==0
k=dummy/IQ;
if((dummy=IA*(dummy-k*IQ)-IR*k)<0) dummy+=IM;
ans=AM*dummy;
dummy^=MASK;// восстанавливаем dummy
return(ans);
}
float unirand1(void) {
int j;
long k;
static long iy=0,iv[NTAB];
float temp;
// инициализация
if(dummy<=0 || !iy) {
// следим, чтобы значение было положительным
if(dummy<0) dummy=-dummy;
else if(dummy==0) dummy=1;
for(j=NTAB+NWUP-1;j>=0;j--) {
k=dummy/IQ;
if((dummy=IA*(dummy-k*IQ)-IR*k)<0) dummy+=IM;
if(j<NTAB) iv[j]=dummy;
}
// первый элемент из таблицы
iy=iv[0];
}
// генерируем новое число
k=dummy/IQ;
if((dummy=IA*(dummy-k*IQ)-IR*k)<0) dummy+=IM;
iy=iv[j=iy/NDIV];iv[j]=dummy;
if((temp=AM*iy)>RNMX) return(RNMX);
else return(temp);
}
float matozhid(float *x)
{
float M[N],MM=0;
for(int j=0;j<N;j++)
{
M[j]=x[j]*1.;
MM+=M[j];
}
return MM/N;
}
float center(float *x,float m)//dyspersia
{
float M[N],Ms=0;
for(int j=0;j<N;j++)
{
M[j]=pow(x[j]-m,s);
Ms+=M[j];
}
return Ms/N;
}
int repeatsearcher(float *x)
{
int evr=0,c;
for(int j=1;j<N;j++)
{
if(x[j]==x[0])
{
evr=j;c=0;
for(int k=j+1;k<N;k++)
if(x[k]==x[k-j]) c++;
else break;
//printf("cyyyyycle %d\n",c);
if(c==N-1-j)break;
}
}
return evr;
}
//конгруэнтный метод
long int XX=20;
int myrand()//Park-Miller
{
long int m=2147483647;
long int a=16807;
XX = abs((a*XX)%m);
return XX;
}
//на основе центрально-предельной теоремы
float gauss()
{
float rnd=0.0;
int i;
for(i=1;i<12;i++)rnd+=(myrand()/(0x7FFFFFFF+1.));//от нуля до единицы
return rnd - 6.0;
}
//selection-denial Neumann
int shu=0;//количество отбросов
float seleden()
{
float r1,r2,z1,z2;
r1 = unirand0();
r2 = unirand0()*607;
//z1 = 0+r1*(4-0);
//z2 = r2*3;
if(r2 > r1*exp(-0.5*r1*r1)) return r1;
else shu++;
}
/*float F(float x)
{
float sigma = 1.;
float R = x/sigma/sigma*exp(-0.5*x*x/sigma/sigma)
return R;
}*/
float rayleigh()
{
float u,l,t;
u=gauss();l=gauss();
t = sqrt(l*l+u*u);
return t;
}
//гистограмма//массив случайных//пределы//кол-во точек//массив гистограммы//кол-во столбиков
void hist(float *x,float x0,float xn, int n,float *p,int m)
{
float xi,dx,pn;
dx=(xn-x0)/m;
pn=1.0/n;
for(int i=0;i<m;i++)
{
p[i]=0;
for(int j=0;j<n;j++)
{
xi=x0+i*dx;
if((xi<x[j])&&(x[j]<xi+dx))
{
p[i]+=pn;
// printf("/////////%d %f \n",j, pn);
}
}
}
}
int main()
{
float P[nn],x[N];
int i;
FILE *fp = fopen("gyst.txt","w");
for(i=0;i<N;i++)
{
//x[i]=unirand1();//Парк-Миллер с перетасовкой
//x[i] = myrand()/(0x7FFFFFFF+1.);//равномерное распределение Парка-Мюллера
//x[i] = gauss();//нормальное распределение Гауса
//x[i] = rayleigh();//нормальное распределение Рэлея или может даже Райса
x[i] = seleden();//метод отбора отказа Неймана
//printf("%f\n",x[i]);
}
//printf("repeats: %d \n",repeatsearcher(x));
//printf("mat ozhid: %f \n",matozhid(x));
//printf("dispers: %f \n",center(x,matozhid(x)));
hist(x,0,1, N,P, nn);
for(i=0;i<nn;i++)
fprintf(fp,"%f \n",P[i]);
//printf("%f \n",P[i]);
printf("unleft: %d \n",shu);//количество отброшенных
fclose(fp);
return 0;
}