Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
5
Добавлен:
18.08.2019
Размер:
3.76 Кб
Скачать
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 1000//повторы эксперимента для дисперсии
#define nn 10//колличество столбиков
#define s 2

// Минимальный компактный генератор случайных чисел Парка и Миллера

// константы Льюиса-Гудмана-Миллера */
#define IA 16807
#define IM 2147483647
#define AM (1./IM)
// константы Шаржа
#define IQ 127773
#define IR 2836
// маска чтоб не мешались нули
#define MASK 123456789

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);
}

// Минимальный компактный генератор случайных чисел Бейса-Дурхема
#define NTAB 32
#define NWUP 8
#define NDIV (1+(IM-1)/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)

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;
}

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();//нормальное распределение Рэлея
        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,4, N,P, nn);

for(int i=0;i<nn;i++)
//fprintf(fp,"%f \n",P[i]);
printf("%f \n",P[i]);

fclose(fp);
return 0;
}
Соседние файлы в папке Gaussrand
  • #
    18.08.2019165 б5fileread.sce
  • #
    18.08.20191.11 Кб5Gaussrand.cbp
  • #
    18.08.2019220 б6Gaussrand.depend
  • #
    18.08.2019319 б5Gaussrand.layout
  • #
    18.08.20190 б5gyst.txt
  • #
    18.08.20193.76 Кб5main.c