English translation

This commit is contained in:
Rnhmjoj 2014-01-13 22:01:52 +01:00
parent 9b41419afb
commit 580b304634
3 changed files with 45 additions and 52 deletions

View File

@ -1,10 +0,0 @@
* Ago di Buffon
*
* Simulazione del metodo dell'ago di Buffon in python 3.
*
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
* @author Michele Guerini Rocco aka Rnhmjoj
* @since 2013

View File

@ -1,22 +1,25 @@
Ago di Buffon # Ago di Buffon
=============
Simulazione del metodo dell'ago di Buffon in python 3. ## Simulation of de Buffon's needle method in python 3.
------------------------------------------------------
### Informazioni ### Info
Un semplice modulo per stimare π usando il metodo dell'ago di Buffon. A simple module to estimate π using the Buffon's needle method.
Tramite turtle graphics è generato un pavimento e disegnati gli aghi casualmente. With Turtle graphics a floor is generated and needles are randomly drawn.
Se un ago incrocia le assi diventa rosso e viene conteggiato. If a needle crosses the axis it turns red and it is counted.
Il valore stimato di π è continuamente stampato e al termine viene mostrato lo scarto dal valore reale. The estimated value of π is continuously printed and at the end the deviation from the real value is shown.
È predisposto con la "stima" di Lazzarini per buoni risultati. It is set with the "estimation" of Lazzarini for better results.
Il migliore trovato è stato con uno scarto di 8*10^-6. The best find was a difference of `8*10^-6`.
### Istruzioni
Parametri:
X,Y: lunghezze degli assi; ### Usage
T: distanza tra le assi del parquet; Parameters:
L: lunghezza dell'ago;
N: numero di iterazioni. X, Y: axes lenght;
T: distance between parquet's axes;
L: length of the needle;
N: number of iterations.
### License
Dual licensed under the MIT and GPL licenses:
http://www.opensource.org/licenses/mit-license.php
http://www.gnu.org/licenses/gpl.html

View File

@ -1,57 +1,57 @@
import math, random import math
import random
import turtle import turtle
#Parametri #Parameters
X = 100 X = 100
Y = 100 Y = 100
T = 20 T = 20
L = 5 / 6 * T L = 5 / 6 * T
N = 213 N = 213
assi = () axes = ()
def impostazioni(): def settings():
"""Impostazioni per inizializzare turtle""" """Turtle settings"""
turtle.title("Ago di Buffon") turtle.title("de Buffon's needle")
turtle.setworldcoordinates(-(X + 2), -(Y), X + 2, Y) turtle.setworldcoordinates(-(X + 2), -(Y), X + 2, Y)
turtle.hideturtle() turtle.hideturtle()
turtle.speed(0) turtle.speed(0)
def vai(x, y): def go(x, y):
"""Sposta il cursore al punto (x, y) senza tracciare una linea.""" """Move cursor to the point (x, y) without drawing a line."""
turtle.pu() turtle.pu()
turtle.goto(x, y) turtle.goto(x, y)
turtle.pd() turtle.pd()
def parquet(t): def parquet(t):
"""Disegna le assi del parquet.""" """Draw parquet's axes."""
global X, assi global X, axes
vai(-X, -Y) go(-X, -Y)
for x in range(-X, X + 1, t): for x in range(-X, X + 1, t):
assi += x, axes += x,
turtle.lt(90) turtle.lt(90)
turtle.goto(x, Y) turtle.goto(x, Y)
vai(x, -Y) go(x, -Y)
turtle.rt(90) turtle.rt(90)
vai(x + t, -Y) go(x + t, -Y)
def ago(l): def needle(l):
""" """
Lancia un'ago. Throw a needle.
Se incrocia le assi lo colora di rosso e restituisce 1, If it crosses the axes it colors red and returns 1,
altrimenti restituisce 0. otherwise it returns 0.
""" """
vai(random.uniform(-X, X), random.uniform(-Y, Y)) go(random.uniform(-X, X), random.uniform(-Y, Y))
x1 = turtle.xcor() x1 = turtle.xcor()
turtle.lt(random.uniform(0, 360)) turtle.lt(random.uniform(0, 360))
turtle.fd(l) turtle.fd(l)
x2 = turtle.xcor() x2 = turtle.xcor()
for x in assi: for x in axes:
if (x1 < x < x2) or (x2 < x < x1): if (x1 < x < x2) or (x2 < x < x1):
turtle.pencolor("red") turtle.pencolor("red")
turtle.bk(l) turtle.bk(l)
@ -60,16 +60,16 @@ def ago(l):
else: else:
return 0 return 0
impostazioni() settings()
parquet(T) parquet(T)
p = 0 p = 0
for i in range(N): for i in range(N):
p += ago(L) p += needle(L)
try: try:
π = (2 * L) / (T * p / N) π = (2 * L) / (T * p / N)
except ZeroDivisionError: except ZeroDivisionError:
π = 0 π = 0
print(π) print(π)
print("Scarto:", abs(100 - (π / math.pi * 100)), "%") print("Deviation:", abs(100 - (π / math.pi * 100)), "%")
turtle.mainloop() turtle.mainloop()