# 蒙特卡洛计算π值演示程序
import time
from random import random
from math import sqrt
import turtle
import sys
import tkinter as tk # 导入tkinter库
# 当导入tkinter模块后,调用 Tk()方法可初始化一个根窗体实例 root ,用 title() 方法可设置其标题文字,用geometry()方法可以设置窗体的大小(以像素为单位)。
# 将其置于主循环中,除非用户关闭,否则程序始终处于运行状态。
def calculate_pi():
darts = int(entry.get()) # 输入投点次数
hits = 0 # 范围内次数的初始化
start_time = time.time() # time模块里的函数,用于获取当前时间戳(以秒为单位)
turtle.setup(800, 800, startx=500, starty=300) # 设置Turtle 绘图窗口的大小和位置,像素是800*800,默认起始位置以屏幕左上角为原点,是(500,300)
turtle.speed(0) # 以下为一些绘图的参数,绘图速度,画笔宽度。
turtle.pensize(2)
for i in range(1, darts + 1):
x, y = random(), random()
x_squared, y_squared = x ** 2, y ** 2
dist = sqrt(x_squared + y_squared) # 计算两点间距离
turtle.penup() # 抬起画笔
turtle.goto(x * 200, y * 200)
turtle.pendown() # 落下画笔,继续画
# 判断圆内圆外
if dist <= 1.0:
hits += 1
turtle.dot(6, "red")
else:
turtle.dot(6, 'blue')
# 这段代码的作用是在控制台上显示下载进度条。当 i 值增加时,根据 j 值的变化,每下载完成 10% 数据时更新一次进度条显示,直到下载完成
j = int(i / (darts / 100))
if j % 10 == 0:
print("\rDownload progress: {:.2f}%".format(j), end="")
sys.stdout.flush() # 强制刷新输出缓冲区,确保信息立即显示在屏幕上而不是保留在缓冲区等待显示
time.sleep(0.01) # 使程序暂停执行 0.01 秒,模拟下载的时间
# 动态显示π计算变化过程
pi = 4 * (hits / darts)
result_label.config(text="π值是 {:.5f}".format(pi))
pi = 4 * (hits / darts)
end_time = time.time() # 再次获取当前时间戳
turtle.exitonclick() # 单击图形界面来关闭绘图窗口,也可使用 turtle.done()
result_label.config(text="π值是 {:.5f}".format(pi) + "\n" + "运行时间是:{:.5f}s".format(end_time - start_time)) # 格式化输出
root = tk.Tk() # 创建主窗口
root.title("蒙特卡洛计算π值") # 设置标题文字
root.geometry("300x200") # 设置窗体的大小
# 创建标签,用于提示用户输入
label = tk.Label(root, text="请输入投点次数:")
label.pack()
# 创建输入框,用户输入投点次数
entry = tk.Entry(root)
entry.pack()
# 创建按钮,点击后执行calculate_pi函数
calculate_button = tk.Button(root, text="计算", command=calculate_pi)
calculate_button.pack()
# 创建标签,用于显示计算结果是,并启动主窗口事件的循环
result_label = tk.Label(root, text="")
result_label.pack()
root.mainloop()
续上一篇,加了一个简单的可视化界面
最新推荐文章于 2024-09-07 20:08:36 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)