J'essaie d'estimer pi en divisant les aires d'un carré et de son cercle intégré, mais j'obtiens ~ 3,66.
Est-ce que quelqu'un voit ce que je fais mal?
inCount=0 outCount=0 it=1000000 L=100 for i in range(it): xran=rnd.random()*L yran=rnd.random()*L xc=abs(0.5*L-xran) yc=abs(0.5*L-yran) r=np.sqrt((xc**2)+(yc**2)) if r<0.5*L: inCount=inCount+1 if r>0.5*L: outCount=outCount+1 if r==0.5*L: inCount=inCount+1 outCount=outCount+1 pigen=inCount/outCount print('pi generated: '+np.str(pigen))
4 Réponses :
Vous avez
inCount=0 outCount=0 it=1000000 L=100 for i in range(it): xran=rnd.random()*L yran=rnd.random()*L xc=abs(0.5*L-xran) yc=abs(0.5*L-yran) r=np.sqrt((xc**2)+(yc**2)) if r<0.5*L: inCount=inCount+1 elif r>0.5*L: outCount=outCount+1 else: inCount=inCount+1 outCount=outCount+1 pigen=pigen=4*inCount/(inCount+outCount) print('pi generated: '+np.str(pigen))
qui donne la proportion de coups à l'intérieur et à l'extérieur du rayon.
Notez que pi / (4-pi) = 3.659792 ... qui est ce que votre code estime actuellement.
Vous avez besoin de
if r<0.5*L: inCount=inCount+1 elif r>0.5*L: outCount=outCount+1 else: inCount=inCount+1 outCount=outCount+1
qui vous donnera quatre fois la proportion de hits à l'intérieur par rapport au total, c'est-à-dire pi
.
Notez également que votre code est actuellement
if r<0.5*L: inCount=inCount+1 if r>0.5*L: outCount=outCount+1 if r==0.5*L: inCount=inCount+1 outCount=outCount+1
qui peut être simplifié avec elif
/ else
. Puisque r
ne peut pas être à la fois supérieur et inférieur à L
, le deuxième if
peut devenir un elif
. De même, si r
n'est ni inférieur ni supérieur à L
, alors il doit être égal, donc le troisième if code > peut simplement devenir un
else
.
pigen=4*inCount/(inCount+outCount)
Cela évitera des comparaisons inutiles de r
et L code> dans votre code.
Votre code final serait alors
pigen=inCount/outCount
C'était presque vrai! J'avais aussi oublié d'ajouter un 4.
Voulez-vous dire 4 *
cela?
Ah, oui - dans ma hâte, j'ai oublié cela.
pigen=inCount/(outCount+inCount)*4
Wai Ha Lee avait presque raison! J'avais aussi oublié d'ajouter un 4.
Si quelqu'un veut savoir comment ça se passe, c'est comme ça (et oui, L peut être ce que tu veux):
import numpy as np import random as rnd inCount=0 outCount=0 it=1000000 L=100 for i in range(it): xran=rnd.random()*L yran=rnd.random()*L xc=abs(0.5*L-xran) yc=abs(0.5*L-yran) r=np.sqrt((xc**2)+(yc**2)) if r<0.5*L: inCount=inCount+1 if r>0.5*L: outCount=outCount+1 if r==0.5*L: inCount=inCount+1 outCount=outCount+1 pigen=4*inCount/(inCount+outCount) print('pi generat: '+np.str(pigen))
p>
inCount
indique le nombre de points dans un cercle de rayon r = L / 2
et outCount
indique le nombre de points dans un carré contenant exactement ce cercle, mais pas dans le cercle lui-même.
inCount
est proportionnel à pi * r ** 2
et outCount
est proportionnel à L ** 2 - pi * r ** 2 = (4 - pi) * r ** 2
. Lorsque vous prenez le ratio, vous obtenez pi / (4 - pi) = 3,66
.
Comme l'a souligné Wai Ha Lee, vous devez calculer 4 * inCount / (inCount + outCount) = pi
.
Pouvez-vous ajouter vos importations au code?
Cela peut ne pas fonctionner, mais essayez plutôt
math.sqrt ()
Pourquoi
L = 100
? Vous ne pouvez pas le faire avecL = 1
?