用蒲丰(buffon)投针来估计π\piπ

1 问题描述
2 问题求解
3 Python实现
 3.1 循环形式
 3.2 向量形式

1 问题描述

 buffon投针问题是18世纪首先被Georges-Louis Leclerc, Comte de Buffon提出的。假设我们有一个由平行的木条组成的地板,每条木条的宽度都是aaa,我们把一个长度为l(l<a)l(l<a)l(l<a)的针随意扔到地板上,针与木条相交的概率是多少?

2 问题求解

 设xxx是针的中心到最近木条的距离,θ\thetaθ是针与该木条之间的角度,如下图(a)(a)(a)。因此当x≤l2sin(θ)x≤\frac{l}{2}sin(\theta)x≤2l​sin(θ)时,针与木条相交。

 临界条件为x≤l2sin(θ)x≤\frac{l}{2}sin(\theta)x≤2l​sin(θ),而xxx的范围为0≤x≤a20≤x≤\frac{a}{2}0≤x≤2a​,θ\thetaθ的范围为0≤θ≤π0≤\theta≤\pi0≤θ≤π,因此我们可以得到图(b)(b)(b)。根据几何概率,针与木条相交的概率就为图中阴影部分的面积与整个矩形的面积的比值。因此有P=∫0πl2sin⁡(θ)dθa2∗π=2laπP=\frac{\int_{0}^{\pi} \frac{l}{2}\sin(\theta)d\theta}{\frac{a}{2}*\pi}=\frac{2l}{a\pi}P=2a​∗π∫0π​2l​sin(θ)dθ​=aπ2l​,据此,我们可以得到π\piπ的估计为π^=2laP\hat{\pi}=\frac{2l}{aP}π^=aP2l​。

3 Python实现

总体思路:生成nnn个(即代表进行nnn次实验)服从U(0,π)U(0, \pi)U(0,π)的随机数θ\thetaθ和nnn个服从U(0,a2)U(0, \frac{a}{2})U(0,2a​)的随机数xxx,令kkk为实验成功的次数,初始为000,即对于每对随机数(θ,x)(\theta, x)(θ,x),如果x≤l∗sin⁡θ2x≤\frac{l*\sin\theta}{2}x≤2l∗sinθ​,那么就视为实验成功,kkk加111。因此最后针与木条相交的概率P=knP=\frac{k}{n}P=nk​,从而可得π\piπ的估计为π^=2lnak\hat{\pi}=\frac{2ln}{ak}π^=ak2ln​。(产生随机数的方法)

3.1 循环形式:

import numpy as np
#定义一个估计π的函数,其中n为实验次数
def buffon(n, l=0.8, a=1):k = 0#产生n个服从U(0,π)的随机数θtheta = np.random.uniform(0, np.pi, n)#产生n个服从U(0,a/2)的随机数xx = np.random.uniform(0, a / 2, n)#进行循环判断for i in range(n):if x[i] <= l * np.sin(theta[i]) / 2:k = k + 1pi = 2 * l * n / (a * k)return pi

结果

#进行10**8次实验
print(buffon(10 ** 8))

输出:3.1411176760252406

3.2 向量形式:

#定义一个估计π的函数,其中n为实验次数
def buffon2(n, l=0.8, a=1):#产生n个服从U(0,π)的随机数θtheta = np.random.uniform(0, np.pi, n)#产生n个服从U(0,a/2)的随机数xx = np.random.uniform(0, a / 2, n)#不进行循环,直接利用numpy的性质,计算速度会更快k = np.sum(x <= l * np.sin(theta) / 2)pi = 2 * l * n / (a * k)return pi

结果

#进行10**8次实验
print(buffon2(10 ** 8))

输出:3.1414584813950164

估计π的第一种方法:蒲丰(buffon)投针相关推荐

  1. Qt5.9一个简单的多线程实例(类QThread)(第一种方法)

    Qt开启多线程,主要用到类QThread.有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run().当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程 ...

  2. 协偏度矩阵 matlab 程序,投资组合收益率高阶矩估计的一种方法——压缩估计

    推文人 | 王彦锋 参考文章: [1] Martellini, Lionel and Volker Ziemann. Improved estimates of higher-order comome ...

  3. 【C语言】求一千以内的素数 第一种方法

    第一种方法:平常思维(人们第一印象会想到的) //什么是素数? -- 除了1和本身之外不能被其他数整除的数 #include "stdio.h"int main(){int n,j ...

  4. JAVASE基础模块三十五( 线程 线程创建的第一种方法 以及线程的一些方法)

    JAVASE基础模块三十五( 线程 线程创建的第一种方法 以及线程的一些方法) 线程 首先要清楚的是 线程依赖于进程 进程 是 正在运行的应用程序 一个正在运行的应用程序 是个进程 这个应用程序又要执 ...

  5. Buffon投针实验:究竟为什么是pi?

    重要通告:最近多次发现我的tom邮箱发出的邮件被识别成了垃圾邮件,是什么原因我还不是很清楚.最近向我的tom邮箱发过邮件但迟迟没有收到回复的朋友麻烦检查一下垃圾邮件箱,或者重新给我发一次邮件,我换一个 ...

  6. [转载]Buffon投针实验:究竟为什么是pi?

    Buffon投针实验:究竟为什么是pi?  Brain Storm |  2009-11-06 20:16| 57 Comments | 本文内容遵从CC版权协议 转载请注明出自matrix67.co ...

  7. Buffon投针实验 · 数学的直观理解 · 基础知识很重要

    从Matrix67博客的一个数学问题说起 http://www.matrix67.com/blog/archives/2494 M大牛语录--     "数学学习真正悲哀的就是,记住了某个神 ...

  8. 圆周率估算的一种方式——蒲丰投针

    从很久很久以前,科学家们就热衷于计算圆周率ππ\pi ,计算的准确度越来越高,出发点也各不相同.那ππ\pi到底是怎么计算出来的呢? 中国的刘辉提出了割圆术算法.他论证将圆分割成多边形,分割来越细,多 ...

  9. u盘启动计算机的几种方式,进入U盘启动模式的启动模式是什么?第一种方法是输入BIO...

    说到该模式,每个人都应该知道,有些朋友在引导时问如何启动U盘安装系统,有些人想问如何进入U盘来启动计算机. 到底是怎么回事?其实如何设置启动U盘启动?下面的编辑器组织了按一下启动键即可进入U盘启动模式 ...

最新文章

  1. RequireJs的使用和快速理解
  2. 参加拥抱HTML5大会及TOPGEEK社区活动纪实
  3. sql注入学习——时间盲注
  4. java web面试_超实用的Java web面试题
  5. leetcode 372. Super Pow | 372. 超级次方(快速幂)
  6. 协方差公式性质证明过程_论文推荐 | 刘志平:等价条件平差模型的方差-协方差分量最小二乘估计方法...
  7. 投篮c语言程序设计,教师招聘笔试体育之篮球必做20题(一)
  8. 【Python】单引号、双引号、三引号和字符串
  9. java等待页面加载_java selenium (十三) 智能等待页面加载完成
  10. 编写一个程序,给出汉字“你”“我”“他”在Unicode表中的位置
  11. 项目经理面试的一些问题讨论
  12. sad代价计算_基于改进代价计算和自适应引导滤波的立体匹配
  13. 批量重命名文件夹和文件名bat脚本
  14. qt远程调试ARM板
  15. 随笔(一)—2018-1-23-ANU暑期学校-无题
  16. 【Anaconda】修改conda默认envs_dirs和pkgs_dirs
  17. linux 环境下安装dubbo管理控制台 dubbo admin
  18. java集成极光推送实现Android的消息推送
  19. 装机春天时刻,盘点4月高性价比国产SSD
  20. javaweb接口开发

热门文章

  1. 5 个 GitHub 项目拿下 Linux
  2. 第七史诗无限显示服务器连接中,第七史诗神器满破是什么意思?神器满破攻略...
  3. android逆向开发工程师需要掌握的技能
  4. 情感天地——《不能牵手就握手吧》
  5. 2021.07.07 宇信科技
  6. VMware虚拟机使用虚拟机网络编辑器NAT模式配置网络图文教程,实现联网功能并测试
  7. 【论文阅读】Video Generation from Single Semantic Label Map-CVPR2019
  8. 上海亚商投顾:两市震荡引分化 汽车产业链获青睐
  9. 如何使用bert做word embedding
  10. Linux实例丢失SSH密钥对的解决步骤