Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Stohastic / Gaussrand / main

.c
Скачиваний:
4
Добавлен:
18.08.2019
Размер:
4.25 Кб
Скачать
#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;
}
Соседние файлы в папке Gaussrand
  • #
    18.08.2019214 б4fileread.sce
  • #
    18.08.20191.11 Кб4Gaussrand.cbp
  • #
    18.08.2019486 б4Gaussrand.depend
  • #
    18.08.2019504 б4Gaussrand.layout
  • #
    18.08.20190 б6gyst.txt
  • #
    18.08.20194.25 Кб4main.c