一、问题分析:蒙特卡洛方法的理论基础是大数定律。大数定律是描述相当多次数重复试验的结果的定律,在大数定理的保证下,
利用事件发生的 频率 作为事件发生的 概率 的近似值。
此题求圆周率。计算圆周率时可以考虑将一个单位圆放在一个正方形中,从而将求解圆周率转化为计算出圆和正方形面积的比例。
借助random函数可以生成大量均匀分布的坐标点,接着统计出图形内的点数,通过它们占总点数的比例和坐标点生成范围的面积就可以求出的近似值。
2、首先根据题目要求,生成伪随机数, 设置随机数种子random.seed(123),接着获取用户输入的撒点数量,同时定义计数器,记录圆内点的数量。
接下来是撒点,循环n次,用 random.uniform(a,b):(随机生成一个a到b之间的一个浮点数(a<=n<=b))函数生成浮点数。
然后通过解析几何上的原理判断点是否在圆内。最后计算圆周率pi = 4 * count / n,并输出结果。
3、为了使结果更加直观,我导入了matplotlib.pyplot as plt
二、源代码以及结果分析
import random
import matplotlib.pyplot as plt
# 设置随机数种子
random.seed(123)
# 获取用户输入的撒点数量
n = int(input())
# 计数器,记录圆内点的数量
count = 0
# 撒点
for i in range(n):
# random.uniform(a,b):随机生成一个a到b之间的一个浮点数(a<=n<=b)
x = random.uniform(0, 1)
y = random.uniform(0, 1)
if x**2 + y**2 <= 1:
count += 1
plt.plot(x, y, 'ro')
else:
plt.plot(x, y, 'b*')
# 计算圆周率
pi = 4 * count / n
# 输出结果
print("{:.6f}".format(pi))
plt.ion()
1、
输入:1024
输出:3.218750
2、
输入:2048
输出:3.195312
3、
输入:4096
输出:3.139648
4、
输入:
输出:1000000
3.141212
可以预见,当撒点数目足够多,结果也会越加趋近pi的真实值,但不会得到真实值
三、心得体会
蒙特卡洛法的相关应用
机器学习
蒙特卡洛算法也常用于机器学习,特别强化学习算法。一般情况下,针对得到的样本数据集创建相对模糊的模型,通过蒙特卡罗方法对于模型中的参数进行选取,使之于原始数据的残差尽可能的小,从而达到创建模型拟合样本的目的。