小样的第三次学习博客——python之蒙特卡洛方法计算π
声明
本人只是一名大一学生,如果有冒犯之处,还请海涵,如有错误,欢迎指出,大佬轻喷
说明
参考书籍:《Python语言程序设计基础》(第2版)嵩天 礼欣 黄天羽 著
同时对其代码做了一丢丢的修改
预备知识(用到的一些库函数)
库名 | 库函数 | 作用 |
---|---|---|
random库 | random() | 随机生成[0.0,1.0)的之间的随机小数 |
math库 | sqrt() | 计算平方根,返回一个小数 |
time库 | pref_counter() | 返回程序运行的CPU时间(可用于计算程序运行时间 |
原理
蒙特卡洛方法是一种通过随机抽样来解决问题的方法,可以用来计算圆周率。具体步骤如下:
在一个正方形内画一个内切圆;
随机生成大量点,落在正方形内;
统计落在圆内的点的数量;
根据圆和正方形的面积比值,计算出圆周率。
参考书籍原理讲解展示
代码
from random import random
from math import sqrt
from time import perf_counter
date = 20000 # 点的数量
hit = 0.0 # 定义hit用于记录圆内点的个数,并初始化
start_time = perf_counter() # 记录程序主要部分开始时间
for i in range(date):
x, y = random(), random() # 随机生成两个[0.0,1.0)的小数作为点的坐标(x,y)
dist = sqrt(x**2+y**2) # 计算点到原点的距离dist
if dist<=1.0: # 如果距离dist<=1.0,则点在圆内,圆内点个数hit加一
hit += 1
Pi = hit/date*4 #计算Pi
print("π是{:.7f}".format(Pi))
end_time = perf_counter() # 记录程序主要部分结束时间
print("程序主要部分运行时间:{}".format(end_time-start_time)) # 结束时间—开始时间=程序主要部分运行时间
首先,导入了random、sqrt和perf_counter函数。然后,定义了一个变量date,表示要生成的随机点的数量。接下来,初始化一个变量hit为0.0,用于记录落在单位圆内的点的数量。在循环中,生成两个随机数x和y,计算点们到原点的距离dist,如果距离小于等于1,则将hit加1。最后,它计算π的值并打印出来。
注意
- 增加采样点的数量(date)可以提高计算精度;
- 由于蒙特卡洛方法是基于随机抽样的,所以每次运行的结果可能会有所不同;
修改点
与参考书籍相比,本文采用了pref_counter函数用于计算程序运行时间。参考书籍采用的clock函数python3.3以后的版本已被剔除
声明
本人也只是一名大一学生,如果有冒犯之处,还请海涵,如有错误,欢迎指出,大佬轻喷