Accueil

Estimation du nombre PI à l'aide de tirages aléatoires

cible

Il existe de multiples techniques pour approximer le nombre pi, les unes plus exotiques que les autres.
Voici détaillée ici une méthode assez originale dite "méthode des fléchettes" mettant à profit la fonction RAND qui génère un nombre pseudo-aléatoire.

Considérons tout d'abord un carré de coté 2 et le cercle inscrit dans ce carré -voir l'image plus bas.
Ce cercle aura pour rayon 1, et constituera notre cible.
On lance maintenant de manière totalement aléatoire un grand nombre de fléchettes sur la cible -imaginons un dispositif qui balaie le carré en tous sens et lâche une fléchette au hasard de temps en temps.
Notons N le nombre total de fléchettes lancées, et n celui des fléchettes qui atteignent la cible.
(Dans toute la suite, on rappelle que les fléchettes qui ratent la cible restent malgré tout dans le carré)

Il semble assez évident que n sera d'autant plus grand que la surface s de la cible sera grande.
n est donc directement proportionnel à s, ce qui se traduit en termes mathématiques par l'égalité:
 s = k. n 

Par ailleurs, nous avons aussi proportionnalité entre N et S, surface du carré, ce qui conduit à:
 S = k. N 

En constatant de plus que S = 4 (surface du carré de côté 2) et que s = pi (surface du cercle de rayon 1), on tire:
 s / S = n / N = pi / 4  d'où:  pi = 4 . n / N 

La simple connaissance de n et N, fruits du hasard, conduit donc à pi, c'est rigolo non ?

Rigolo peut-être, mais il serait impossible de réaliser simplement l'expérience car les fléchettes se gêneraient vite sur la cible.
En revanche, on peut facilement simuler informatiquement une telle situation à l'aide d'un petit programme écrit en langage PhP:

Pour faire tourner le programme, c'est par ici...
Pour analyser ce programme, c'est par là...

  1.   <p>
  2.   <form action="" method="post">
  3 .   Nombre de fléchettes: <input type="number" size="7" name="N"/><input type="submit" value="Ok" /></form>
  4.   </p>
  5.   <?php
  6.   if( $_POST['N'] != 0 )
  7.   {
  8.   $N = $_POST['N'];
  9.   function rnd()
10.    {
11.    return rand (-1000,1000) / 1000;
12.    }
13.   for ( $n = 1 ; $n <= $N ; $n++ )
14.   {
15.   $x = rnd();
16.   $y = rnd();
17.   $r = sqrt ( pow($x,2) + pow($y,2) );
18.   if ( $r < 1)
19.   {
20.   $in++;
21.   }
22.   }
23.   $pi = round ( 4 * $in / $N , 4 );
24.   $pourcent = round ( abs( (($pi - pi()) / pi()) * 100 ) , 1 );
25.   echo "Avec $N fléchettes, on obtient PI~ <font color=red>$pi</font><br /> Ecart avec pi : $pourcent %";
26.   }
27.   ?>

cible Les lignes 1 à 4 proposent à l'utilisateur de saisir son nombre de fléchettes qui est alors stocké dans la variable $N
Lignes 9 à 12: on définit une fonction qui génère un nombre aléatoire compris entre -1 et 1.
La fonction précédente est appelée à deux reprises aux lignes 15 et 16 afin de définir 2 variables $x et $y, coordonnées de notre fléchette.
Ligne 17: La variable $r contient la racine carrée de la somme des carrés de $x et $y. Selon le théorème de Pythagore, cela correspond à la distance entre le centre O de la cible et la fléchette.
Lignes 18 à 21: si $r < 1 c'est à dire si la fléchette est bien dans la cible, on incrémente de 1 la variable $in qui fait office de compteur de fléchettes dans la cible tandis que $N fait office de compteur de fléchettes lancées au total.
Ligne 13: On renouvelle l'attribution de $x, $y, le calcul de $r puis le test sur ce dernier, $N fois.
Ligne 23: On calcule enfin la variable $pi selon la formule pi = 4 . n / N évoquée plus haut, ce qui donne ici $pi = 4 * $in / $N
Ligne 25: Affichage du résultat.