import random
import turtle
import tkinter as tk
from tkinter import ttk
class MonteCarloPi:
def __init__(self, total_points):
self.total_points = total_points
self.inside_circle = 0
self.outside_circle = 0
self.inside_square = total_points
def calculate_pi(self):
self.inside_circle = 0 # 每次计算时重置
self.outside_circle = 0 # 每次计算时重置
turtle.clear()
draw_square_and_circle()
turtle.tracer(0, 0) # 关闭动画效果
for _ in range(self.total_points):
x, y = random.uniform(-1, 1), random.uniform(-1, 1)
if x**2 + y**2 <= 1.0:
self.inside_circle += 1
turtle.goto(x * 200, y * 200)
turtle.dot(3, "blue")
else:
self.outside_circle += 1
turtle.goto(x * 200, y * 200)
turtle.dot(3, "red")
turtle.update() # 更新屏幕
pi = 4 * self.inside_circle / self.total_points
return pi
def frequency(self):
return round(self.inside_circle / self.inside_square, 3)
def draw_square_and_circle():
turtle.speed(0)
turtle.penup()
turtle.goto(-200, -200)
turtle.pendown()
for _ in range(4):
turtle.forward(400)
turtle.left(90)
turtle.penup()
turtle.goto(0, -200)
turtle.pendown()
turtle.circle(200)
turtle.penup()
class PiApp:
def __init__(self, root):
self.root = root
self.root.title("随机模拟试验")
self.root.geometry("400x300") # 设置窗口大小
# 设置字体样式
style = ttk.Style()
style.configure("TLabel", font=("Helvetica", 16))
style.configure("TButton", font=("Helvetica", 16))
style.configure("TEntry", font=("Helvetica", 16))
self.label = ttk.Label(root, text="请输入撒点数量:")
self.label.pack(pady=10)
self.entry = ttk.Entry(root)
self.entry.pack(pady=10)
self.entry.bind("<Return>", self.calculate_pi) # 绑定 Enter 键
self.button = ttk.Button(root, text="进行随机模拟试验", command=self.calculate_pi)
self.button.pack(pady=10)
self.result_label = ttk.Label(root, text="")
self.result_label.pack(pady=10)
def calculate_pi(self, event=None):
try:
N = int(self.entry.get())
monte_carlo = MonteCarloPi(N)
pi_approx = monte_carlo.calculate_pi()
frequency = monte_carlo.frequency()
self.result_label.config(text=f"落在圆内的点数: {monte_carlo.inside_circle}\n"
f"落在圆外的点数: {monte_carlo.outside_circle}\n"
f"落在圆内的点数与总点数的比值: {frequency:.4f}")
except ValueError:
self.result_label.config(text="请输入有效的数字。")
def main():
root = tk.Tk()
app = PiApp(root)
turtle.setup(500, 500)
turtle.Screen()._root = root # Integrate turtle with tkinter
root.mainloop()
if __name__ == "__main__":
main()
21212213213213123123123123121232132
最新推荐文章于 2025-05-18 21:45:30 发布