首页 > 编程语言 >Python学习笔记(一)蒙特卡罗算法求圆周率π

Python学习笔记(一)蒙特卡罗算法求圆周率π

时间:2023-11-01 11:11:21浏览次数:28  
标签:Python 圆周率 random 算法 蒙特卡罗 pi 复杂度

绪论

\(\pi\)(圆周率)是数学和物理学普遍存在的常数之一,可以被定义为圆周长和直径之比或者圆的面积与半径平方之比(\(l=2\pi r\)和\(S=\pi r^2\))。\(\pi\)是一个无理数,下面将用蒙特卡罗算法求\(\pi\)的数值近似。

要求

1.要求能算到小数点后面越多越好‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬。
‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪2.并用进度条提示算的进度,能给出多种进度条越好。
‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬3.要求给出算圆周率Pi具体公式或者算法说明。

代码

Ptthon代码实现
from math import sqrt
from random import random
from time import perf_counter

DARTS =1000000
hits =0.0
start = perf_counter()
for i in range(1,DARTS+1):

    x,y =random(),random()
    dist =sqrt(x**2+y**2)
    if dist <=1.0:
        hits =hits+1
pi = 4*(hits/DARTS)
print("Pi值为:{}.".format(pi))
print("运行时间是:{:.5f}s".format(perf_counter()-start))

输出

image

算法

这是一个几何概型,有一个外切圆形的正方形,直径和边长均为1,此时正方形和圆的面积之比为\(\pi\),假设有无穷多的点随机落在该图形内,概率的期望值等于\(\pi\)。
image

蒙特卡罗算法的基本思想就是利用概率分布代替问题都求解。当然,这里我们不可能取到无穷的点,由大数定律,可以通过取尽可能多的点来逼近期望值。
调用标准库random和math,计算每个点到圆心的距离,统计在圆内的点数,for循环即可。

复杂度

单从算法实现来看,可以算出空间复杂度为\(O(1)\),而时间复杂度为\(O(N^2)\),如果当样本数的数量级大起来,所花时间也是相当大,如果说要追求精确度的话,蒙特卡罗算法不是一个很好的算法。

优势

不过,蒙特卡罗算法理解和实现都很容易,对于实践而言,对于数值求解往往不需要很精确,只需要控制在一个合理的数量级。
数据的独立性很强,并行计算容易。

标签:Python,圆周率,random,算法,蒙特卡罗,pi,复杂度
From: https://www.cnblogs.com/cai-yuhaoyyds/p/17801929.html

相关文章

  • 【python基础】repr函数
     描述repr()函数将对象转化为供解释器读取的形式。语法以下是repr()方法的语法:repr(object)参数object--对象。返回值返回一个对象的string格式。实例#coding=UTF-8s="物品\t单价\t数量\n包子\t1\t2"print(s)print(repr(s))output:物品单价数量包子1......
  • 阿基米德螺线和花瓣曲线的Python绘制
    frommatplotlibimportpyplotaspltimportnumpyasnpdefplt_draw_dynamic(x,y):foriinrange(x.shape[0]):plt.pause(0.001)plt.cla()plt.xlim((-200,200))plt.ylim((-200,200))plt.plot(x[:i],y[:i])......
  • python深浅拷贝学习
    copy的原文链接(仅供自己学习查看):python浅析格式化输出和深浅copy-战争热诚-博客园(cnblogs.com) 首先我们从切片技术说起。它应用于所有的序列,包括:列表,字符串,元祖。但是切片不能应用于字典,对于字典只能使用D.copy()和D.deepcopy()方法。下面具体说一下深......
  • 带有最小间隔时间的队列读取实现 —— Python异步编程
     (注:照片源自免费网站,地址:https://www.freepik.com/photos/angry-panda/13)  ==================================================   ==================================================......
  • Python求Π
    fromrandomimportrandomfrommathimportsqrtfromtimeimportperf_counterimporttime#进度条print("2022310143117")foriinrange(1,101):print("\r",end="")print("进度:{}%:".format(i),"▓"*(i//......
  • 如何在linux系统中安装python3.8.1 并卸载 python3.6.2 更新python3引导到3.8.1
    安装python3.8.1步骤1:检查Python版本在终端中输入以下命令来检查当前安装的Python版本:python--version步骤2:安装编译Python所需的依赖项更新系统软件包,并安装构建Python所需的一些工具和库。在终端中运行以下命令:sudoaptupdatesudoapt-getinstall-ybuild-essen......
  • 【爬虫实战】用Python采集任意小红书笔记下的评论,爬了10000多条,含二级评论!
    目录一、爬取目标二、爬虫代码讲解2.1分析过程2.2爬虫代码三、演示视频一、爬取目标您好!我是@马哥python说,一名10年程序猿。我们继续分享Python爬虫的案例,今天爬取小红书上指定笔记("巴勒斯坦"相关笔记)下的评论数据。老规矩,先展示结果:截图1:截图2:截图3:共爬取了1w多条"......
  • python求Π
    fromrandomimportrandomfromtimeimportperf_counterpi=0N=100start=perf_counter()forkinrange(N):pi+=1/pow(16,k)*(4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6))print('公式法:')print("圆周率值是{}......
  • 使用Python批量发送个性化邮件
    前言在现代工作环境中,我们经常需要向多个收件人发送个性化的邮件。通过使用Python编程语言,我们可以自动化这个过程,从Excel文件中读取收件人和相关数据,并发送定制的邮件。首先,导入所需的库:importpandasaspdimportsmtplibfromemail.mime.multipartimportMIMEMultipart......
  • Python算圆周率
    importsysimporttimedefprogress_bar():    foriinrange(1,101):        print("\r",end="")        print("Downloadprogress:{}%:".format(i),"▋"*(i//2),end="")        s......