很郁闷为什么网上的布丰投针都写的这么复杂,而且很多都是复读机直接copy别人,其实这是个很精巧、有趣的实验,所以打算自己写一个布丰投针的介绍

故事背景

你在教室里写数学题,突然有个人,抱着一大盒针走过来,然后把针撒到地上,然后很淡定地点点头说,“嗯,我知道π等于多少了”。

是不是觉得很神奇?!这跟π什么关系?!!!

没错,这个人就是布丰。

实验过程

这个实验也很简单,两段距离为D的平行线、一根长为L的针(L≤D)

投针实验就是把这根针扔到两段平行线之间,然后统计针碰到平行线的次数,例如图中的两根针,红色针就是碰到,黑色针就是没碰到

哪这和π是怎么扯上关系的呢?是从”针碰到平行线“的数学定义中推导得到的。我们先想办法定义针的位置,取针的中点向最近的平行线做垂线,定义该垂线为XXX,该垂线与针的夹角为θθθ
因为针是在两段平行线之间,故
X∈[0,D/2]X\in[0, D/2]X∈[0,D/2]
同时因为总能找到一个小于90°的角,故
θ∈[0,π/2]θ\in[0, π/2]θ∈[0,π/2]


XXX与θθθ与平行线可以组成一个直角三角形,所以斜边的长度是X/cosθX/cosθX/cosθ

因此,只要
X/cosθ<L/2X/cosθ < L/2X/cosθ<L/2
即X<(L/2)∗cosθ即X < (L/2)*cosθ即X<(L/2)∗cosθ
的话(其实取≤也可以,影响不大),就说明针碰到了平行线,否则就说明没碰到,下图分别为”没碰到和“碰到”的情况

下面我们来表示出“针碰到平行线的概率”,即
P{X<L2cosθ}P\{X<\frac{L}{2}cosθ\}P{X<2L​cosθ}

求概率,本质就是比值,而因为XXX与θθθ是连续的,所以上面的比值可以等价于面积的比值

即,当XXX与θθθ在其取值范围内变化时,会生成无数个点。由上文可知X∈[0,D/2]X\in[0, D/2]X∈[0,D/2]、θ∈[0,π/2]θ\in[0, π/2]θ∈[0,π/2],因此这些点的总面积为S=D2∗π2=D∗π4S = \frac{D}{2} * \frac{π}{2} = \frac{D*π}{4}S=2D​∗2π​=4D∗π​ (由XXX与θθθ的取值范围决定)

在这无数个点中,有一些点满足X<L2cosθX<\frac{L}{2}cosθX<2L​cosθ这一条件,这些点的面积记作S1S_1S1​,所以

P{X<L2cosθ}=S1SP\{X<\frac{L}{2}cosθ\} = \frac{S1}{S}P{X<2L​cosθ}=SS1​

那怎么把S1S_1S1​表示出来呢?因为针的中心点和角度是没关系的,所以我们可以假设中XXX与θθθ是相互独立的,且他们在各自的取值范围内服从均匀分布,所以可以写成

剩下的就算微积分的事情了

所以可得
P{X<L2cosθ}=2∗Lπ∗DP\{X<\frac{L}{2}cosθ\} = \frac{2*L}{π*D}P{X<2L​cosθ}=π∗D2∗L​

接下来,我们就可以反向思维,把πππ表示出来
π=2∗LP{X<L2cosθ}∗Dπ = \frac{2*L}{P\{X<\frac{L}{2}cosθ\}*D}π=P{X<2L​cosθ}∗D2∗L​

所以,只要知道了LLL、DDD、P{X<L2cosθ}P\{X<\frac{L}{2}cosθ\}P{X<2L​cosθ}就可以算出πππ

那问题来了,P{X<L2cosθ}P\{X<\frac{L}{2}cosθ\}P{X<2L​cosθ}不是根据上面积分算出来的吗?你这样不就鸡生蛋蛋生鸡了?

其实P{X<L2cosθ}P\{X<\frac{L}{2}cosθ\}P{X<2L​cosθ}还可以通过做实验的途径得到,例如我投100次针,其中有50次针碰到了平行线,那么P{X<L2cosθ}=50100=0.5P\{X<\frac{L}{2}cosθ\}=\frac{50}{100}=0.5P{X<2L​cosθ}=10050​=0.5

这样一来,πππ也就能求出来了

这种通过做实验来求积分的方法,就是大名鼎鼎的蒙特卡洛方法
(你也可以认为是暴力求解积分哈哈哈)

以上,就是布丰投针实验求πππ的过程

代码实验

import random
import numpy as np
from tqdm import tqdm# 平行线距离
D = 2
# 针的长度
L = 1
# 实验次数
exp_num = 100000000
# 触碰次数
touch_num = 0
for i in tqdm(range(1, exp_num+1)):X = random.uniform(0, D / 2)theta = random.uniform(0, np.pi / 2)if X < (L/2)*np.cos(theta):touch_num += 1
# 计算π
P = touch_num/exp_num
print('π = {}'.format((2*L)/(P*D)))

结果为:

π = 3.1412599467996216

大家可能会对theta = random.uniform(0, np.pi / 2)很疑问,我想求得是πππ,但是代码中就已经给定πππ(即np.pi),这不就犯规了吗?

其实不是,因为代码中我们要模拟现实的投针场景,所以theta = random.uniform(0, np.pi / 2)就是我们的现实,相当于是上帝提前设定好的,我们不知道的
我们的结果、我们想求的东西,就是希望去找到theta = random.uniform(0, np.pi / 2)中的πππ(即np.pi)是多少,它是我们的目标,我们希望结果尽可能的接近他

换句话说,如果我把theta = random.uniform(0, np.pi / 2)中的πππ(即np.pi)换成数字5的话(即改为theta = random.uniform(0, 5 / 2)

我们输出的结果就会非常接近5,因为我们此时想要拟合的目标是5

运行下面的代码(只改了theta那一行),输出结果为:π = 5.00038202918703

import random
import numpy as np
from tqdm import tqdm# 平行线距离
D = 2
# 针的长度
L = 1
# 实验次数
exp_num = 100000000
# 触碰次数
touch_num = 0
for i in tqdm(range(1, exp_num+1)):X = random.uniform(0, D / 2)theta = random.uniform(0, 5 / 2)if X < (L/2)*np.cos(theta):touch_num += 1
# 计算π
P = touch_num/exp_num
print('π = {}'.format((2*L)/(P*D)))

πππ只是个外衣,不要被骗了哈哈哈

布丰投针给我们提供的是一种解决问题的思路,”通过数学推导与实验(蒙特卡洛方法)的配合,求出难以直接计算得到的值“,我认为这才是这个实验的巧妙之处~

【数学】通俗解释布丰投针实验过程、蒙特卡洛方法及python仿真代码相关推荐

  1. 布丰投针java实现,MATLAB模拟布丰投针实验

    MATLAB模拟布丰投针实验 标签(空格分隔): 算法 Buffon's Needle 桌面上有距离为a的若干平行线,将长度为L的针随机丢在桌面上,则这根针与平行线相交的概率是多少?假定L < ...

  2. MATLAB模拟布丰投针实验

    MATLAB模拟布丰投针实验 标签(空格分隔): 算法 Buffon's Needle 桌面上有距离为a的若干平行线,将长度为L的针随机丢在桌面上,则这根针与平行线相交的概率是多少?假定L < ...

  3. 蒲丰投针实验原理_布丰投针实验 MATLAB仿真 以及报告

    布丰投针实验原理.仿真过程以及 MATLAB仿真代码.完整的布丰投针实验报告. 以下内容无关: -------------------------------------------分割线------ ...

  4. 强化学习 蒲丰投针实验 蒙特卡洛算法

    目录 一.蒲丰投针实验 1.1背景故事 1.2原理介绍 二.蒙特卡洛方法 2.1方法介绍 2.2经验轨迹 2.3在线学习与离线学习 2.4数学原理 一.蒲丰投针实验 1.1背景故事 1777年,蒲丰请 ...

  5. R语言对布丰投针(蒲丰投针)实验进行模拟和动态可视化生成GIF动画

    最近我们被客户要求撰写关于动态可视化的研究报告,包括一些图形和统计输出. 介绍 布丰投针是几何概率领域中最古老的问题之一.它最早是在1777年提出的.它将针头掷到有平行线的纸上,并确定针和其中一条平行 ...

  6. 布丰投针试验的仿真和误差估计

    布丰投针试验 一.试验原理 1.试验步骤 2.理论概率及π\piπ的计算与误差 二.Python代码的实现 一.试验原理 1.试验步骤 ​ 1.选一个长度为lll的针.再选取一张白纸,上面划分许多平行 ...

  7. 用一根线模拟浦丰投针实验——Java

    用一根线模拟浦丰投针实验--Java 浦丰投针实验(Buffon's needle problem)   本文先给出正确的推理过程,错误的推导过程放在文章末尾,方便大家探讨.   不多废话,直奔主题. ...

  8. 蒲丰投针计算机模拟ppt,蒲丰投针实验模课件.doc

    概率论与数理统计实验 蒲丰投针与蒙特卡罗法 班级 应数12级01班 学号 2012444086 姓名 张旭东 蒲丰投针与蒙特卡罗法 张旭东 2012444086 (重庆科技学院 数学与应用数学 ,重庆 ...

  9. 一文读懂蒲丰投针实验

    这个博客源于概率论复习期间,蒙特卡罗方法的思想起源,这种求π\piπ的思路非常的巧妙 附:历史上用蒲丰投针实验估计圆周率的实验记录,来源 蒲丰投针 蒲丰投针实验是法国数学家.自然科学家"乔治 ...

  10. Matlab模拟蒲丰投针实验计算Π值

    文章目录 1.前言 2.实验目的 3.实验原理 (1)问题描述 (2)问题求解 4.实验过程 5.实验结果 6.实验结论 7.Matlab代码 1.前言 学习了概率论,决定自己动手编程实现蒲丰投针实验 ...

最新文章

  1. 程序员必备网站之一:No Design
  2. MySQL中查询时对字母大小写的区分
  3. SAP UI5 application - model propagation
  4. vue-provide/inject轻松实现跨级访问祖先组件
  5. MaxCompute studio与权限那些事儿 1
  6. maven项目导出为jar包
  7. The “data“ option should be a function that returns a per-instance value in component definitions.
  8. Linux常见问题解答--如何修复“tar:Exiting with failure status due to previous errors”
  9. 计算机网络考研知识点史上最全背诵笔记
  10. python判断是否为素数_python判断一个数是否为素数
  11. STM32L010C6Tx的睡眠 按键唤醒和RTC Alarm闹钟唤醒
  12. PDF文档如何添加图片签名
  13. PyTorch搭建LSTM实现多变量多步长时间序列预测(二):单步滚动预测
  14. Unity il2cpp LinuxInterop_dlopen Error
  15. IIS 服务器常见漏洞
  16. Qt label使用html样式设置文字
  17. uboot nor flash驱动移植(基于am29lv160bt)之环境变量没法保存的办法 .
  18. 微信小程序好看的输入信息界面——发送验证码倒计时
  19. 自暴自弃庸庸碌碌,或许也能活得下来,但这绝不是生活
  20. 三个数比大小 输出最大值

热门文章

  1. SMT32的RTC的晶振为什么是32768Hz
  2. Win10电脑资源管理器怎么打开?五种打开方式详解
  3. git 拉取代码时提示:would clobber existing tag
  4. HTML5期末大作业:京东商城网站设计——京东商城购物网站(4页) 基于Html+Css+javascript的网页制作(购物主题)
  5. OSChina 周日乱弹 —— 我重新说
  6. 分层图解决的一些最短路问题
  7. 计算n阶行列式的C语言实现
  8. 网络系统管理赛项之Debian七. 2021年全国职业院校技能大赛将挑选各省1人或1组队伍参赛
  9. DRAM Devices Organization
  10. 辣椒app软件测试,testflight辣椒视频APP