除了祖冲之的割圆法和格雷戈里公式,借助于循环和随机数,我们还可以通过一种特别有趣的方法来估算圆周率。

本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载,但需要注明原作者"海洋饼干叔
叔";本文不允许以纸质及电子出版为目的进行抄摘或改编。
1.《Python编程基础及应用》,陈波,刘慧君,高等教育出版社。免费授课视频 Python编程基础及应用
2.《Python编程基础及应用实验教程》, 陈波,熊心志,张全和,刘慧君,赵恒军,高等教育出版社Python编程基础及应用实验教程
3. 《简明C及C++语言教程》,陈波,待出版书稿。免费授课视频

在历史的长河里,从古至今的数学家们尝试了无数种计算圆周率的方法。 其中,法国数学家布冯(1707年1788年)和拉普拉斯(1749年1827年)提出的方法比较有趣。

在边长为2的正方形内有一个直径为2半径为1的内切圆。如图6-2所示。根据圆面积的计算公式,内切圆的面积 s = πr² ,由于r=1,所以π = 内切圆的面积。边长为2的正方形面积为4,那么在已知正方形的面积为4的情况下,如何求得内切圆的面积呢? 布冯提出了投针的方法。假设10 000根针“均匀随机”地垂直落在正方形上,每根针在正方形上形成一个“投点”,那么落入圆内的投点数量与圆的面积正相关,即:简单推导,可得:
假设有8 000根针落在了圆内,其余的2000根落在了圆外。此时,内切圆面积 ≈ 4 × 8 000 / 10 000 = 4× 0.8 = 3.2,即圆周率π ≈ 3.2。
下述代码模拟了上述过程,即将数量众多的针投射到正方形,然后通过估算内切圆面积求得π。

//Project - FindPi
#include <iostream>
#include <cmath>
using namespace std;int main()
{const int N = 10000;    //投点总数int nHits = 0;          //圆内投点数for (int i=0;i<N;i++){double x = 2.0*rand()/RAND_MAX - 1.0; //随机数取投点x坐标double y = 2.0*rand()/RAND_MAX - 1.0; //随机数取投点x坐标if (x*x + y*y <= 1.0)  //投点位于内切圆内nHits += 1;        //圆内投点数+1}double pi = 4.0*nHits/N;   //通过计算圆面积估算圆周率cout << "pi = " << pi;return 0;
}

上述程序的执行结果为:

pi = 3.1464

第8 ~ 9行:常量N代表投点总数,变量nHits表示落在圆内的投点数。

第11 ~ 16行:使用循环进行N次投点。

第12 ~ 13行:随机计算投点的x坐标和y坐标。rand()返回0 ~ RAND_MAX的随机整数,rand()/RAND_MAX的值域为0 ~ 1,将该值乘2再减1,即得取值范围为-1 ~ +1的随机数。理论上,rand()函数返回的随机数在值域内是“均匀”分布的。

注意: 整数(rand())/整数(RAND_MAX)的结果为整数,为了确保整个计算过程统一使用双精度浮点数进行计算,作者先用2.0*rand(),然后再除RAND_MAX,由于2.0是double类型的字面量,C++会将rand()返回的整数类型提升为double,再与2.0进行相乘…

第14行:计算投点距离圆心的距离,如果距离<=1.0,说明投点在圆内。注意,作者在这里没有使用sqrt()进行开方运算,由于圆的半径是1.0,此时的开方在数学上是可以省略的。由于开平方运算需要花费大量的CPU时间,这种处理很有价值。

第15行:如果投点在圆内,将nHits加1。

第18行:按前述公式估算圆的面积,也就是pi。注意,正方形的面积为4.0。

为了更形象地向读者展示投点法估算圆周率的数学原理,我们还用Python中的绘图库matplotlib绘制了下述投针示意图:这些投针点“均匀”地投在了正方形内,多数落入圆内,少数落在圆外。

读者可能会觉得上述圆周率的估算值3.1464不够准确。请修改N值,增加投针数量,再试一试。理论上,N越大,结果越精确。

为了帮助更多的年轻朋友们学好编程,作者在B站上开了两门免费的网课,一门零基础讲Python,一门零基础C和C++一起学,拿走不谢!

简洁的C及C++

Python编程基础及应用

如果你觉得纸质书看起来更顺手,目前Python有两本,C和C++在出版过程中。

Python编程基础及应用

Python编程基础及应用实验教程

C/C++微实践 - 发现圆周率相关推荐

  1. 【Python】使用投点法计算圆周率 发现圆周率

    本文引用自作者编写的下述图书; 本文允许以个人学习.教学等目的引用.讲授或转载,但需要注明原作者"海洋饼干叔 叔":本文不允许以纸质及电子出版为目的进行抄摘或改编. 1.<P ...

  2. Python编程基础与应用(陈波著)微实践

    微实践1--鸡兔同笼 有若干只鸡兔同在一个笼子里,从上面数,有35个头,从下面数,有94只脚.问笼中各有多少只鸡和兔? 解决方案: iHead = 35 iFeet = 94 a = iFeet - ...

  3. 【备份恢复】Oracle 数据备份与恢复微实践

    <Oracle 数据备份与恢复微实践> 新年新群招募: 中国Oracle精英联盟170513055 群介绍:本群是大家的一个技术分享社区,在这里可以领略大师级的技术讲座,还有机会参加Ora ...

  4. 鹅长微服务发现与治理巨作PolarisMesh实践-上

    文章目录 概述 定义 核心功能 组件和生态 特色亮点 解决哪些问题 官方性能数据 架构原理 资源模型 服务治理 基本原理 服务注册 服务发现 安装 部署架构 集群安装 SpringCloud应用接入 ...

  5. 微服务发现与注册之Eureka源码分析

    作者:陌北有棵树,Java人,架构师社区合伙人! [一]微服务之服务发现概述 关于微服务,近年来可谓是大火,业界也吹刮着一种实践微服务的风潮.本人有幸在去年参与到一个向微服务过渡的产品,再结合自己所学 ...

  6. python字典遍历 没有顺序_Python中字典的顺序问题(为什么实践发现字典的遍历和方法popitem并不是随机的?)...

    据称,字典的遍历是没有一定顺序的,但是我在实践中发现,它总是从第一组元素开始依次遍历到最后一个元素. my_dict = dict.fromkeys(range(10**5)) i = 0 for k ...

  7. matlab沃利斯圆周率计算公式,物理学家在量子力学中发现圆周率π的计算公式

    圆周率π 圆周率π是圆的周长和其直径的比值,这是一个常数,在数学中是非常重要的.这个数是一个无理数,也就说是一个无尽不循环的小数,大约为3.14159--,后面有无数个小数位,永远也写不尽.经过数千年 ...

  8. C/C++微实践 - 细胞计数

    从一张二值化的动物组织照片中识别并统计出细胞的数量,涉及文件操作以及图的宽度优先遍历算法. 本文引用自作者编写的下述图书; 本文允许以个人学习.教学等目的引用.讲授或转载,但需要注明原作者" ...

  9. 微服务发现组件Eureka:微服务注册

    #注册到eureka的服务地址 eureka:client:service-url:defaultZone: http://localhost:6868/eureka/ #服务配置 server:po ...

最新文章

  1. 思科高级路由与交换(CISCO 部分) 第5天
  2. java静态钥匙上同步代=代码块锁
  3. 理解 Memory barrier(内存屏障)无锁环形队列
  4. Winform中设置ZedGraph的X轴的刻度根据曲线获取
  5. 9.6Gbps WiFi联盟宣布802.11ax协议!
  6. Java:comp/env/讲解与JNDI
  7. 关于HotSpot VM以及Java语言的动态编译 你可能想知道这些
  8. 设计模式 - 单例模式(Singleton Pattern)
  9. signal.h-----信号函数
  10. 基金投资需要注意什么?
  11. wifi 2.4GHz和5GHz范围
  12. web基础、tomcat搭建
  13. 100个Java实战项目视频+代码+笔记
  14. 回炉重造之JAVA---枚举
  15. win10使计算机进入睡眠状态什么意思,win10如何进入睡眠模式 电脑睡眠模式设置教程...
  16. C、C++、Java到Python,编程入门学习什么语言好?
  17. Linux下集群的搭建
  18. php冰蝎一句话,利用动态二进制加密实现新型一句话木马之PHP篇(转)冰蝎
  19. 什么是MySQL数据库?应用环境有哪些?
  20. 5V升压充电8.4V芯片HU5914

热门文章

  1. 数据库技巧:整理SQLServer非常实用的脚本
  2. Windows 系统错误代码大全3
  3. SpringBoot 整合oauth2实现授权第三方应用(实战版)
  4. Java课程设计之 购物车管理系统
  5. 生成式人工智能时代,如何寻找合适的创业伙伴?
  6. 查准率、查全率、F1值
  7. 基于红外图像融合的美颜思路
  8. git分支合并错误的解决办法
  9. html 图片整体缩放,html页面中css缩放图片的方法
  10. 苹果笔记本怎么安装python_苹果系统MAC下如何安装Python解释器