mar
14

Pi Day : calculer Pi en PHP avec rand()

Par Maxime  //  Programmation  //  2 Commentaires

Aujourd’hui, c’est le 14 mars. Noté à l’anglaise, on est le 3/14 et, tenez-vous bien, ça fait le nombre Pi à deux décimales. Vous allez me dire « il est un peu siphonné lui ! », mais pour ma défense, quand on a fait des mathématiques et de la physique à un niveau un peu poussé, on aime Pi ! Je l’ai jamais fêté

Donc pour cette occasion un peu spéciale, je vais vous présenter une méthode un peu inattendue pour calculer Pi. On va utiliser la fonction rand().

On va utiliser le hasard et les probabilités. Fuyez pas, vous allez voir, c’est sympa. C’est la méthode de Monte-Carlo (vous savez, ses casinos, ses jeux de hasard…).

Regardons cette figure présentant un quart de disque de rayon 1 :

Détermination de Pi par la méthode de Monte Carlo

L’aire de ce quart de disque est de Pi / 4 et l’aire totale du carré est de 1.

Le principe est simple : on va tirer des points au hasard. La probabilité (notons la P) que chaque point soit dans ce quart de cercle est donc de P=Pi/4. Et cette probabilité, on va la calculer en faisant un tirage de N points. Il y en aura disons X qui tomberont dans le quart de cercle. On divise X par N et on a notre probabilité P.

Finalement, on a P=Pi/4 et P=X/N donc Pi/4=X/N d’où Pi=4*X/N.

On tire alors un point au hasard. On va utiliser la fonction rand (ou mt_rand, plus rapide et meilleure au niveau distribution aléatoire) pour déterminer ses coordonnées X et Y. Et s’il vérifie X²+Y² < 1 alors il est dans le quart de cercle. On répète ça un paquet de fois et le tour est joué.

Voyons comment on code ça en PHP. J’ai optimisé un peu la chose en ne ramenant pas les coordonnées dans [0,1]² ce qui évite des divisions. Le code :

<?php
$totalDotNumber = 100001;

$inCircleDotNumber = 0;
$maxRand = mt_getrandmax();
$maxRand_pow2 = pow($maxRand, 2);

for ($i=0; $i<$totalDotNumber; $i++) {
    if1 < $maxRand_pow2) {
        $inCircleDotNumber++;
    }
}

$frequency = $inCircleDotNumber / $totalDotNumber;
$pi = $frequency*4;

echo 'Points tirés : '.$totalDotNumber."\n";
echo 'dont dans le cercle : '.$inCircleDotNumber."\n";
echo 'Fréquence : '.$frequency.' (=Pi/4)'."\n";
echo 'd\'où : Pi = '.$pi."\n";
?>

On tire 500 000 de points, ça prend 5 secondes et on obtient par exemple Pi=3,14436971126. Bon la précision n’est pas fameuse, mais on a bien (heu souvent…) 3,14 et des poussières.

On va s’arrêter là avec Pi, on va pas chercher à améliorer la chose, c’était juste pour le principe. La méthode de Monte-Carlo permet de calculer des intégrales de dimensions supérieure à 1 (avec 2 on a des aires, 3 des volumes, 4 c’est pour Albert Einstein dont c’est l’anniversaire aujourd’hui…).

Moi, ça m’épate. Pas vous ?

  1. pow(mt_rand(), 2)+pow(mt_rand(), 2 []

2 Commentaires à “Pi Day : calculer Pi en PHP avec rand()”

  • Tiens original ! T’as trouvé ça tout seul ?

    Je termine les cours dans quelques semaines et je dois avouer que PI ne va pas me manquer… Du moins au début !

  • Ah non, j’ai pas trouvé ça tout seul. Mais quand je l’ai lu, ça m’était évident ! Je sais plus ce qui m’a amené à ça. En fait, c’est assez connu (enfin si on veut) pour du calcul intégral.
    Pour Pi, c’est de la pure curiosité. Ça m’a épaté, et en relisant, ça m’épate toujours autant !

    J’ai l’impression que Pi n’est jamais bien loin…

Leave a comment