Я знаю, что есть много обучающих программ о том, как вычислить пи, используя иглы Буффона , но я не нашел ни одного в tkinter.
Я новичок, извините за грязный код, но я скоро проведу вас через него.
После отрисовки установки она генерирует случайные координаты x1 и y1 для начальной точки линии.Обратите внимание, что я хочу, чтобы длина строк составляла 50 единиц.Поэтому я генерирую x_rel
, который может находиться в диапазоне от -50 до 50. После этого, используя теорему Пифагора, я вычисляю y_rel
.Случайно это может быть сделано отрицательным, или это может остаться положительным.Чтобы получить конечные координаты линии, вы просто складываете x_rel
и x1
, то же самое для y.
Чтобы обнаружить столкновение с одной из начальных линий на доске, я сравниваю первые числа y1 и y2.Если они одинаковы, то столкновения не происходит (это работает, потому что разрыв между каждой стартовой линией на доске равен 100).После подсчёта столкновений я просто вычисляю число пи и печатаю его.Но обычно возвращается ~ 2,6.Но другие программы, подобные этой, которые я нашел в Интернете, могут довольно точно рассчитать число пи.Где моя ошибка?
import tkinter as tk
import random
import math
count = 0
class App:
def __init__(self, root):
self.root = root
root.title("PI calculator")
c = tk.Canvas(root, height=700, width=700)
c.pack()
c.create_line(100, 100, 600, 100)
c.create_line(100, 200, 600, 200)
c.create_line(100, 300, 600, 300)
c.create_line(100, 400, 600, 400)
c.create_line(100, 500, 600, 500)
c.create_line(100, 600, 600, 600)
for x in range(100000):
c.create_line(self.generate_coords(), fill="red", width=1.5)
def generate_coords(self):
choices = [1, 0]
x1 = random.randint(100, 600)
y1 = random.randint(100, 600)
x_rel = random.randint(-50, 50)
y_rel = math.sqrt(50**2 - x_rel**2)
if random.choice(choices) == 1:
y_rel = -abs(y_rel)
if random.choice(choices) == 0:
y_rel = abs(y_rel)
x2 = x1 + x_rel
y2 = y1 + y_rel
col = self.detect_collision(y1, y2)
if col == True:
global count
count += 1
return x1, y1, x2, y2
def detect_collision(self, y1, y2):
first_num_1 = math.floor(y1/100)
first_num_2 = math.floor(y2 / 100)
if first_num_1 != first_num_2:
return True
else:
return False
root = tk.Tk()
window = App(root)
pi = (2*50*100000)/(100*count)
print(count)
print(pi)
root.mainloop()
38243
2.6148576210025363