Добавил:
yermolenkoigor9
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Stohastic / Montecarlo / main
.c#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 200//повторы эксперимента для дисперсии
#define nn 10//количество столбиков
#define IA 16807// Минимальный компактный генератор случайных чисел Парка и Миллера
#define IM 2147483647// константы Льюиса-Гудмана-Миллера
#define AM (1./IM)
#define IQ 127773// константы Шаржа
#define IR 2836
#define MASK 123456789// маска чтоб не мешались нули
#define NTAB 32// числa Бейса-Дурхема
#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 gauss()
{
float rnd=0.0;
int i;
for(i=1;i<12;i++)rnd+=unirand1();//от нуля до единицы
return rnd - 6.0;
}
float rayleigh()
{
float u,l,t;
u=gauss();l=gauss();
t = sqrt(l*l+u*u);
return t;
}
float F(float x)
{
float p=0,z=1;
return cos(z*sin(x)-p*x);
}
int main()
{
float a=0,h=3.1415,S = 0,P[nn][nn],x[N],y[N];
int i,k;
FILE *fp = fopen("gyst.txt","w");
for(i=0;i<N;i++)
S += F(a+h*(1.*rand())/(RAND_MAX+0.));
S *= h/N/3.1415;
printf("%f ",S);
for(i=0;i<N;i++)
{
x[i]=unirand1();//Парк-Миллер с перетасовкой
y[i]=unirand1();
//x[i] = gauss();//нормальное распределение Гауса
//x[i] = rayleigh();//нормальное распределение Рэлея
//printf("%f\n",x[i]);
}
/*for(k=0;k<nn;k++)
for(i=0;i<nn;i++)
fprintf(fp,"%f ",P[k][i]);
//printf("%f ",P[k][i]);
*/
fclose(fp);
return 0;
}