#05 - Estimation du nombre pi
Énoncé
Écrire un programme qui calcule une estimation de la valeur du nombre pi avec une approche probabiliste.
Calcul de PI par la méthode de Monte-Carlo
Le calcul de π par la méthode de Monte-Carlo consiste à tirer au hasard des nombres x et y dans l'intervalle [0 ; 1].
Si x² + y² < 1 le point M (x, y) appartient à un quart de disque de rayon 1. La probabilité pour qu'il en soit ainsi est le rapport des aires du quart de disque de rayon 1 et du carré de côté 1 et soit π / 4.
Dans cette appliquette n est le nombre total de points générés par une suite pseudo-aléatoire, p est le nombre de points à l'intérieur du quart de disque et 4 p / n donne par conséquent une valeur approchée de π.
--> Soure: https://jpq.pagesperso-orange.fr/proba/montecarlo/index.htm
Solution
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define RAYON 1
#define MIN 0
#define MAX 123456
#define MINTIRS 10
#define MAXTIRS 1000000000
int TirerUnPoint(void)
{
float xTire, yTire, dist;
int estdanslecercle=1;
// On tire un point dans le quart du carré [0, 1]×[0, 1]
xTire=1.0*(rand()%(MAX-0+1)-MIN)/MAX;
yTire=1.0*(rand()%(MAX-0+1)-MIN)/MAX;
dist=xTire*xTire + yTire*yTire;
if (dist>RAYON*RAYON)
{
estdanslecercle=0;
}
return estdanslecercle;
}
void CalculerPi(int nombreDeTirs)
{
int i, ncercle=0;
float surface, pi;
for (i=0; i<nombreDeTirs; i++)
{
ncercle+=TirerUnPoint();
}
// p/n
surface=(1.0*ncercle)/nombreDeTirs;
// calcul de pi
pi=4*surface;
printf("Ntirs: %d\t\t\tpi: %f\n", nombreDeTirs, pi);
}
int main()
{
int i;
srand(time(NULL));
for (int i=MINTIRS; i<=MAXTIRS; i*=10)
{
CalculerPi(i/2);
CalculerPi(i);
}
return 0;
}