La méthode de Monte-Carlo consiste à placer des points aléatoirements dans un carré d’aire et de côté 1 dont dans ce carré un quart de cercle est tracé.
Le rayon de ce quart de cercle est 1 et l’aire vaut \(\frac{\pi}{4}\).
Ensuite on compte le nombre de points placés aléatoirement dans ce carré qui arrivent à l’intérieur de ce quart de cercle pour approximer pi.
En effet, la proportion des points qui arrivent dans ce quart de cercle permet d’approximer la rapport entre l’aire du quart de cercle sur celui de l’aire du carré ce qui nous donne une approximation de \(\frac{\pi}{4}\).
Il nous faut alors faire \(4 \times \frac{\pi}{4}\) pour obtenir notre approximation de \({\pi}\).
Cette définition nous permet alors d’écrire ce programme.
let monte_carlo iterations =
let rec monte_carlo2 reste total =
match reste with
| 0 -> let pi = 4. *. float_of_int total /. float_of_int iterations in
pi
| _-> let x = Random.float 1. in
let y = Random.float 1. in
let in_circle = if x *. x +. y *. y <= 1. then
1
else
0
in
monte_carlo2 (reste-1) (total+in_circle)
in
monte_carlo2 iterations 0
Voici la signature du programme :
val monte_carlo : int -> float = <fun>
Toutefois cette méthode ne permet pas de calculer plus de quelques décimales, pour 10 millions de points placés on peut s’attendre à obtenir de l’ordre de 3 décimales correctes.
# monte_carlo 500
- : float = 3.136
# monte_carlo 5000
- : float = 3.1856
# monte_carlo 50000
- : float = 3.14544
# monte_carlo 500000
- : float = 3.140144
Vous pouvez essayer le code directement dans votre compilateur ou interpréteur ocamlc, ocamlopt ou via :