Python-蒙特卡罗计算圆周率

本文介绍了蒙特卡洛法,其起源可追溯到1777年法国数学家布丰的投针实验,20世纪40年代由S.M.乌拉姆和J.冯·诺伊曼正式提出。文中通过正方形框内切圆随机投点的方式求圆周率,给出代码并解释关键语句函数,最后总结该方法是通过多次投放随机点模拟概率。

蒙特卡洛法

        蒙特卡罗方法于20世纪40年代美国在第二次世界大战中研制原子弹的“曼哈顿计划”计划的成员S.M.乌拉姆和J.冯·诺伊曼首先提出。数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的Monte Carlo—来命名这种方法,为它蒙上了一层神秘色彩。在这之前,蒙特卡罗方法就已经存在。1777年,法国数学家布丰(Georges Louis Leclere de Buffon,1707—1788)提出用投针实验的方法求圆周率π。这被认为是蒙特卡罗方法的起源。

简单来说:就是一个正方形框里有一个内切圆(如下图),往框里随机投放大量的点,利用落在圆里的点的数目来求出圆周率

 我们知道,正方形和内切圆面积之比的4:π(不信你可以算一下),所以圆周率=落在圆内的随机点数*4/投点次数

                                                   

 

不多说,我们直接上代码!!!

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import  Circle

#投点次数
n=10000

#圆的基本信息
r=1.0
a,b=(0.,0.)

#随机点的正方形区域边界
x_min,x_max=a-r,a+r
y_min,y_max=b-r,b+r

#开始投放随机点
x=np.random.uniform(x_min,x_max,n)  #均匀分布,左闭右开
y=np.random.uniform(y_min,y_max,n)

#计算随机点到圆心的距离
d=np.sqrt((x-a)**2+(y-b)**2)

#统计落在单位圆的随机点数目
count=sum(np.where(d<r,1,0))

#蒙特卡罗求圆周率
pi=4*count/n

print(pi)

#图形表示
fig=plt.figure()
axes=fig.add_subplot(111)
axes.plot(x,y,'ro',markersize=1)
plt.axis('equal')   #防止图形变形

circle=Circle(xy=(a,b),radius=r,alpha=0.5)
axes.add_patch(circle)

plt.show()

结果显示:

                       

可能有些语句函数会看不懂,下面我来简单的说一下,仅供参考:

1)random.uniform(low,high,size):在区间[low,high)内随机生成size个样本数目,需要注意的是uniform不能单独使用,需要通过random库调用

2)np.where(condition,x,y):根据条件生成新的数组,condition是条件,符合条件的就是x,不符合条件的就等于y,所以np.where(d<r,1,1)意思就是落在圆内的随机点记为1,反之为0,再用sum()就可以直接算出落在圆内的随机点的数目了

3)add_subplot(111):意思是把画布分割成一行一列,图形在第一个位置,创建完figure对象后不能直接画图

4)plt.axis('equal'):图形的x轴和y轴的范围相等

5)add_patch():在之前的111位置上添加一个东西,这里添加的是圆形

小结一下画图的步骤:

(1)创建figure对象

(2)创建一个或多个subplot子图

(3)在子图上绘画图形

(4)展示图形

 

总结:蒙特卡罗法就是通过多次投放随机点,模拟概率,

参考来源:https://www.cnblogs.com/hhh5460/p/6713287.html

 
 
<think>好的,我现在需要帮助用户用Python通过蒙特卡洛方法计算圆周率。首先,我应该回忆一下蒙特卡洛方法的基本原理。蒙特卡洛方法是一种通过随机采样和概率统计来解问题的方法计算圆周率的思路通常是在一个正方形区域内随机撒点,然后统计落在四分之一圆内的点的比例,从而估算圆的面积,进一步得到π的值。 根据用户提供的引用,比如引用[2]中提到,撒点的数量越多,结果越精确,而且需要使用Python的random模块。用户还提到要设置随机数种子为123,并接收用户输入的撒点数量,输出保留六位小数的π值。 接下来,我需要考虑代码的结构。首先,导入random模块,并设置种子。然后,获取用户输入的撒点数量n。接着,进行循环,生成n个随机点,每个点的x和y坐标都在0到1之间。对于每个点,计算其到原点的距离,如果小于等于1,则计入圆内的点数。最后,根据比例计算π的近似值,公式应该是4*(圆内点数/总点数)。 需要注意的是,用户输入可能需要进行有效性检查,比如是否为整数,但根据示例代码可能不需要处理异常,直接转换为整数即可。输出结果要保留六位小数,可以使用格式化字符串,例如“{:.6f}”.format(pi)。 现在,将这些步骤转化为代码。首先导入random,设置种子。然后获取输入,转换为整数。初始化计数器。循环n次,生成x和y,判断是否在圆内。最后计算并输出结果。需要确保代码的正确性,比如使用random.seed(123)来保证结果可重复,正确计算距离平方是否小于等于1,避免使用开根号以优化性能。 检查示例是否有错误,比如是否正确应用了四分之一圆的面积公式。是的,因为正方形的面积是1,四分之一圆的面积是π/4,所以比例乘以4得到π的值。这点在引用[2]和[3]中都有提到,所以公式是正确的。 另外,代码要符合PEP8规范,变量名清晰,比如用count表示圆内的点数。最后测试一下代码,比如当n=1000000时,输出是否合理。同时,用户可能需要示例代码,所以需要按照引用中的要编写,确保正确使用随机数生成和格式化输出。</think>根据蒙特卡洛方法原理和引用资料,Python实现步骤如下: 1. **核心思路** 在单位正方形$[0,1] \times [0,1]$内随机撒点,统计落在1/4圆内的点数量。当撒点数为$n$时,圆周率近似值为: $$ \pi \approx 4 \times \frac{\text{圆内点数}}{n} $$ 2. **完整代码实现** ```python import random random.seed(123) # 固定随机数种子保证结果可复现[^2] n = int(input()) # 接收用户输入的撒点数量 count = 0 for _ in range(n): x = random.uniform(0, 1) # 生成[0,1)范围内的x坐标 y = random.uniform(0, 1) # 生成[0,1)范围内的y坐标 if x**2 + y**2 <= 1: # 判断是否在单位圆内[^3] count += 1 pi = 4 * count / n print("{:.6f}".format(pi)) # 格式化输出保留6位小数 ``` 3. **关键参数说明** - `random.seed(123)`:确保每次运行生成相同的随机序列[^2] - `x² + y² ≤ 1`:判断点是否在单位圆内的数学依据[^3] - 乘以4的原因:计算的是1/4圆的面积比例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_41644183

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值