使用蒙特卡罗方法计算圆周率π Python

【问题描述】
假设有一个单位圆,其面积就是π,
单位圆的外接正方形的边长为2,故正方形的面积是4
在正方形内随机产生m个点,假设落在圆内的点的数量为n,则n/m近似等于圆与正方形的面积比
也就是n/m=π/4,据此可以求出π的近似值
要求,
m的值在运行时通过input输入
随机数种子设为100,也就是在for循环之前使用如下语句
random.seed(100)
提示: 产生[-1,1]之间的随机小数可以用random库的uniform函数
【输入形式】整数
【输出形式】保留3位小数
【样例输入】
10000
【样例输出】
3.140
【解题思路】
我们可以虚拟一个场景,在x-y直角坐标系中有一个边长为2,中心再原点的正方形,内部有一个内切单位圆。
在这里插入图片描述
那么我们以这个正方形为界限,在正方形内部随机生成坐标点(x,y),计算点到圆心(坐标原点(0,0))的距离 len, 通过与圆半径1作比较是否在在圆内,若在圆内部则n的数值+1。
需要注意的是:
1. 因为选择(0,0)作为坐标原点,那么随机数的生成范围是【-1,1】,uniform(a,b)函数的作用是生成【a,b】之间的随机浮点数。
2. 关于随机数种子,真正意义上的随机数(或者随机事件)在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结果是不可预测的,是不可见的。但是计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,是可见的
而随机数种子 seed( ) 用于指定随机数生成时所用算法开始的整数值,如果使用相同的seed( )值,则每次生成的随即数都相同(一个种子值对应一个随机数序列),如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。

【Python代码】

import random
m = int(input())
n = 0
random.seed(100)
for i in range(m):
    x = random.uniform(-1,1)
    y = random.uniform(-1,1)
    len = pow(x**2+y**2,0.5)
    if len < 1:
        n += 1
pi = 4*(n/m)
print("%.3f"%pi)
  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用Python蒙特卡罗方法计算圆周率近似值可以通过以下步骤实现: 1. 首先,我们需要了解蒙特卡罗方法的原理。蒙特卡罗方法是一种基于随机抽样的统计模拟方法,通过生成大量的随机点来估计某个问题的解。在计算圆周率的问题中,我们可以通过在一个正方形内随机生成点,并统计落入圆内的点的数量来估计圆周率的值。 2. 创建一个正方形,并在其中绘制一个圆。假设圆的半径为r,则正方形的边长为2r。 3. 生成大量的随机点,并判断每个点是否落在圆内。可以使用random模块中的random()函数生成0到1之间的随机数,然后将其映射到正方形内的坐标。 4. 统计落在圆内的点的数量。可以使用一个计数器变量来记录落在圆内的点的数量。 5. 根据蒙特卡罗方法的原理,圆的面积与正方形的面积之比等于落在圆内的点的数量与总点数之比。由于正方形的面积为(2r)^2=4r^2,而圆的面积为πr^2,所以可以得到以下公式: π/4 = 落在圆内的点的数量 / 总点数 6. 根据上述公式,可以计算出π的近似值: π ≈ 4 * (落在圆内的点的数量 / 总点数) 下面是一个使用Python实现蒙特卡罗方法计算圆周率的示例代码: ```python import random def estimate_pi(num_points): points_inside_circle = 0 total_points = num_points for _ in range(num_points): x = random.uniform(-1, 1) y = random.uniform(-1, 1) distance = x**2 + y**2 if distance <= 1: points_inside_circle += 1 pi_approximation = 4 * (points_inside_circle / total_points) return pi_approximation # 调用函数进行估计 approx_pi = estimate_pi(1000000) print("Approximation of pi:", approx_pi) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值