Created
January 2, 2020 14:38
-
-
Save Nick3523/42ea3a359655dc968d7cc9c4d216c64d to your computer and use it in GitHub Desktop.
Buffon's Needle Problem
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
''' | |
n = nombre de fois où l'aiguille est lancée | |
nbEssais = nombre de fois où l'expérience est répetée | |
a = longueur de l'aiguille | |
b = distance entre 2 lattes | |
theta = l'angle formée par l'aiguille et la latte | |
xcenter = les cordonnées x de l'aiguille sur le sol | |
On limite les valeurs theta et du centre comme suit : | |
0 < theta < pi/2 | |
0 < xcenter < b/2 | |
''' | |
import random | |
import math | |
def buffon(n,nbEssais,a,b): | |
data = [] | |
for i in range(nbEssais): | |
nhits = 0 | |
for j in range(n): | |
xcent = random.uniform(0,b/2.0) #Les valeurs possibles du centre sont limitées à la moitié de la largeur | |
theta = random.uniform(0,math.pi/2) #De même, l'angle formé est limité entre 0 et pi/2 | |
xtip = xcent - (a/2.0)*math.cos(theta) #Si les cordonnées x du centre de l'aiguille sont < au cos de l'angle formé par l'aiguille et la latte, alors l'aiguille coupe 2 lattes. | |
if xtip < 0 : | |
nhits += 1 | |
c = 2.0*a*n | |
d = b*nhits | |
approx_pi = c/d | |
data.append(approx_pi) | |
return data | |
''' | |
La fonction accurate_pi va m'indiquer jusqu'à quel % mon experience me rapproche de la vrai valeur de pi, hâte de voir le résultat ! | |
''' | |
def accurate_pi(data): | |
true_pi = math.pi | |
max_accurate = 0 | |
for d in data : | |
tmp = d/true_pi | |
if(tmp <= 1) : #Si le pourcentage dépasse 1, ça signifie que que l'estimation dépasse la vrai valeur de pi, ça ne m'intéresse pas d'un milimètre alors ! | |
if tmp > max_accurate : | |
max_accurate = tmp | |
print("La plus haute précision obtenue est ",max_accurate) | |
nbEssais=500 | |
n=4000 | |
a = 2 #longueur de l'aiguille vaut 2 | |
b = 2 #largeur entre les lattes vaut 2 | |
data = buffon(n,nbEssais,a,b) | |
accurate_pi(data) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment