English translation
This commit is contained in:
parent
9b41419afb
commit
580b304634
10
License.txt
10
License.txt
@ -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
|
|
39
README.md
39
README.md
@ -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
|
||||||
|
48
de Buffon.py
48
de Buffon.py
@ -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()
|
||||||
|
Loading…
Reference in New Issue
Block a user