使用蒙特卡罗方法计算圆周率π 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
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值