/*Soluzione Esercizio calcolo del Pi Greco col metodo Monte Carlo*/ #include #include #include main(){ int seed,counter,ntrials; double truepi,estimatepi,R,R2,x,y,epsilon,delta; truepi=4*atan(1.0); printf("CALCOLO DEL PIGRECO (o dell'area del cerchio) CON IL METODO MONTE CARLO HIT OR MISS \n"); printf("Inserisci precisione \n"); scanf("%lf",&epsilon); while(epsilon<=0){ printf("Errore, reinserisci una precisione strettamente positiva \n"); scanf("%lf",&epsilon); } printf("Inserisci Raggio cerchio \n"); scanf("%lf",&R); while(R<=0){ printf("Errore, reinserisci un raggio strettamente positivo \n"); scanf("%lf",&R); } /*Qualche inizializzazione*/ R2=R*R; counter=0; ntrials=0; seed = time(0); srand48(seed); /*Itero: poiche' l'operazione va fatta almeno una volta preferisco usare il do/while*/ do{ ntrials++; x=(double)lrand48()/RAND_MAX*2*R-R; y=(double)lrand48()/RAND_MAX*2*R-R; if (x*x+y*y<=R2) counter++; estimatepi=(double)counter*4./(ntrials); delta=fabs(estimatepi-truepi); printf("%20.10lf %20.10lf \n",estimatepi,delta); }while(delta>epsilon); /*Stampo il risultato finale*/ printf("# iterazioni: %i Stima Pi:%20.10lf Deviazione dal valore noto:%20.10lf \n",ntrials,estimatepi,delta); printf("# iterazioni: %i Stima Area:%20.10lf Deviazione dal valore noto:%20.10lf \n",ntrials,estimatepi*R2,delta*R2); exit(0); }