double f (double x){return pow(x,-0.25)*pow(1-x,-0.75);} //функция
double r (){return (double)(rand())/RAND_MAX;} //случайное число, равномерно распределённое на единичном отрезке
int main()
{
/**
* Метод Монте-Карло
**/
setlocale(LC_ALL,"rus");
double I1, disp1, I2, disp2, I3, disp3, a, b, *x, sum=0, sq=0;
int N;
cout<<"Введите пределы интегрирования"<<endl;
cin>>a>>b;
cout<<"Введите количество испытаний"<<endl;
cin>>N;
x = new double[N];
srand(time(0));
//p=1
for (int i=0; i<N; i++){
x[i]=r()+a;
//cout<<x[i]<<" "<<f(x[i])<<endl;
sum+=f(x[i]);
}
//cout<<sum<<endl;
I1=sum/N;
for (int i=0; i<N; i++) sq+=pow(f(x[i])-I1,2);
disp1=sqrt(sq/(N-1));
cout<<"При rho=1:"<<endl<<"I^="<<I1<<", sigma^="<<disp1<<endl;
//p=x+2
sum=0;
double C=1/(pow(b,2)/2+2*b-pow(a,2)/2-2*a);
//cout<<C<<endl;
for (int i=0; i<N; i++){
x[i]=-2+sqrt(4+2*r()/C);
//cout<<x[i]<<" "<<f(x[i])/(C*(x[i]+2))<<endl;
sum+=f(x[i])/(C*(x[i]+2));
}
I2=sum/N;
for (int i=0; i<N; i++) sq+=pow(f(x[i])/(C*(x[i]+2))-I2,2);
disp2=sqrt(sq/(N-1));
cout<<"При rho=x+2:"<<endl<<"I^="<<I2<<", sigma^="<<disp2<<endl;
return 0;
}