使用蒙特卡罗方法计算圆周率π 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)
使用蒙特卡罗方法计算圆周率π Python相关推荐
- Python用蒙特卡罗方法计算圆周率近似值
实验目的: 1.理解蒙特Ÿ卡罗方法原理. 2.理解for循环本质与工作原理. 3.了解random模块中常用函数. 实验内容: 蒙特Ÿ卡罗方法是一种通过概率来得到问题近似解的方法,在很多领域都有重要的 ...
- 【Python】蒙特卡罗方法计算圆周率及给定随机数种子
蒙特卡罗方法 利用随机点分布,让随机点足够的多,用指定区域随机点数与总区域随机点数做比值来求取指定区域面积 求解圆周率,在一个正方形中撒点,根据在1/4圆内点的数量占总撒点数的比例计算圆周率值. 代码 ...
- python:蒙特卡罗方法计算圆周率
求解圆周率可以采用蒙特卡罗方法,在一个正方形中撒点,根据在1/4圆内点的数量占总撒点数的比例计算圆周率值. ...
- Python项目实践:蒙特卡罗方法计算圆周率
一.数学思维 # CalPi.py n = 100 Pi = 0 for k in range(n):Pi += 1 / pow(16, k) * (4 / (8 * k + 1) - 2 / (8 ...
- 使用蒙特卡罗方法计算圆周率
介绍 这个东西网上已经有很多相关的内容了, 我只是对这个过程感兴趣, 所以自己来做了一个. 网上, 大多数纯粹计算的, 对于我这种视觉型的人来说, 还是要看一下比较好. 这里我加入了 matplotl ...
- 种子数是123,如何用蒙特卡罗方法计算圆周率
#pi.py from random import random,seed DARTS=eval(input()) seed(123) hits=0.0 for i in range (DARTS): ...
- 蒙特卡洛方法计算圆周率
import random import mathdef calpai():n = 10000000 #随机实验次数r = 1.0 #圆的半径a, b = (0.0, 0.0) #中心点x_neg, ...
- Python+numpy实现蒙特卡罗方法估计圆周率近似值
问题描述:使用蒙特卡罗方法估计圆周率近似值,具体描述详见以前发的文章蒙特.卡罗方法求解圆周率近似值原理与Python实现 技术要点:Python扩展库numpy中的模块random可以批量生成特定范围 ...
- 用蒙特卡罗方法实现圆周率的计算
用蒙特卡罗方法实现圆周率的计算 要求(以下分析结果要在实验报告上体现): 根据所得到PI值的精确度(前后两次PI值的差,小于0.0001)来确定是否终止实验. 对比不同精确度(0.01, 0.001, ...
最新文章
- VSTS LoadTest使用原则
- java如何处理csv文件上传_java处理csv文件上传示例
- 崛起的超级智能:是否会是下一个“麦克卢汉式”预言?
- win11+AMD的cpu+3060GPU电脑安装 tensorflow-GPU+cuda11+cudnn
- Emacs 快速指南
- nodejs: mkdirs 递归创建目录
- 二叉树遍历(深度优先+广度优先)
- PHP7.1安装memcaehd扩展
- C语言:求X的Y次方
- TeamTalk源码分析(1)
- ArcGIS在洪水普查、风险评估及区划应用
- win10 开机自动启动脚本
- Linux 内核签名(签名内核模块)、linux 驱动签名
- 陈莉君: Linux内核的那些书
- 腾讯优图实现人脸对比
- 使用c语言编程首先要新建,【C语言编程入门系列】—— 第三章,编写第一个C语言程序!...
- 使用vigil 监控微服务系统包含可视化界面
- 二叉树中序遍历(递归+非递归)Java
- python中.mat的图像数据怎么转换为.npy的数据
- 重贴:MFC类中获得其它类指针 (转)