21212213213213123123123123121232132

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值