π的计算

圆周率π是一个无理数,没有任何一个精确公式能够计算π值, π的计算只能采用近似算法。

国际公认的PI值计算采用蒙特卡洛方法。

蒙特卡洛(Monte Carlo)方法,又称随机抽样统计试验方法。

  当所求解问题是某种事件出现的概率,或某随机变量期望值时,可以通过某种“试验”的方法求解。

  即:蒙特卡洛是利用随机试验求解问题的方法。

蒙特卡洛方法

  ? 蒙特卡洛方法提供了一个利用计算机中随机数和随机试验解决现实中无法通过公式求解问题的思路

  ? 它广泛应用于金融工程学,宏观经济学,计算物理学(如粒子输运计算、量子热力学计算、空气动力

    学计算)等领域中。

蒙特卡洛方法求解π的步骤:

  首先构造一个单位正方形和1/4圆

  

  随机向单位正方形和圆结构抛洒大量点,对于每个点,可能在圆内或者圆外,当随机抛点数量达

到一定程度,圆内点将构成圆的面积,全部抛点将构成矩形面积。圆内点数除以圆外点数就是面积之

比,即π/4。随机点数量越大,得到的π值越精确。

π计算问题的IPO表示如下:

  ? 输入:抛点的数量

  ? 处理:对于每个抛洒点,计算点到圆心的距离,通过距离判断该点在圆内或是圆外。

       统计在圆内点的数量

  ? 输出:π值

 1 #pi.py
 2 from random import random
 3 from math import sqrt
 4 from time import clock
 5 DARTS = 1200
 6 hits = 0
 7 clock()
 8 ###核心代码
 9 for i in range(1, DARTS):
10     x, y = random(), random()   #random() 给出随机的坐标值(x,y)
11     dist = sqrt(x**2 + y**2)    #sqrt() 计算抛点到原点距离
12     if dist <= 1.0:             #判断是否落在圆内
13         hits = hits + 1
14 pi = 4 * (hits/DARTS)
15 ###
16 print("pi的值是 %s" % pi)
17 print("程序运行时间是 %-5.5ss" % clock())

结果:

  

  ? 由于DARTS点数量较少,π的值不是很精确。

 

时间: 2024-10-09 23:07:00

π的计算的相关文章

使用R语言计算均值,方差等

R语言对于数值计算很方便,最近用到了计算方差,标准差的功能,特记录. 数据准备 height <- c(6.00, 5.92, 5.58, 5.92) 1 计算均值 mean(height) [1] 5.855 2 计算中位数 median(height) [1] 5.92 3 计算标准差 sd(height) [1] 0.1871719 4 计算方差 var(height) [1] 0.03503333 5 计算两个变量之间的相关系数 cor(height,log(height)) [1] 0

NumPy基础:数组和失量计算

NumPy : Numerical Python,是高性能科学计算和数据分析的基础包. 部分功能: ndarray:一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组: 用于对整组数据进行快速运算的标准数学函数(无需编写循环): 用于读写磁盘数据的工具以及用于操作内存映射文件的工具: 线性代数.随机数生成以及傅里叶变换功能: 用于集成C.C++.Fortran等语言编写的代码工具: 大部分数据分析应用关注的功能: 用于

MySQL计算百分比方法介绍

根据相应条件抽出相应count数(myCount) 抽出总count数(totalCount) 计算百分比:myCount / totalCount * 100 四舍五入:使用ROUND函数ROUND(number,要保留的小数位),ROUND(myCount / totalCount * 100,1) 下面给出示例供参考: SELECT ROUND(T1.co/T2.totalCo*100,1)    FROM      (SELECT COUNT(*) AS co        FROM f

也来说说关于未在本地计算机上注册“VFPOLEDB.1”的程序的解决方法

大家都知道VFP是一个非常古老的数据库.但是,还有一些单位用到这些数据库. 前段时间,也做了一个关于DBF数据导出的功能的测试.程序以前有同事写好了,但当我进行修改调试的时候,问题就出来了. 调试的时候,一切都是正常的,VFPOLEDBSetup.msi这个肯定得先安装. 但是,架设到IIS上之后,就不行了,出现未在本地计算机上注册"VFPOLEDB.1"的程序这样的错误. 由于之前也没碰过DBF文件导入导出或者操作方面的问题,所以,第一想到的是百度. 百度上面,当然有好多答案,基本上

js 小数计算为啥和想象中不一样!

今天遇到了一个比较有趣的事,如果要你计算0.1+0.2等于多少你会怎么回答? "0.3啊!"你可能都不会考虑.我也一样,当a=0.1,b=0.2时 if(a+b === 0.3){...}.我可能等一下午都等不到大括号中的内容被执行. 为啥呢?因为在js中0.1+0.2=0.30000000000000004.说起来你可能不信,又或者去验证一下.结果为啥是这样?在我查找资料之后豁然开朗.对于浮点型数据,大多语言计算都会丢失精度.但是像c++/java这种厉害的语言都有自己封装的一套方法

算法-计算阶乘n!末尾0的个数

算法逻辑转载自计算阶乘n!末尾0的个数: 问题描述    给定参数n(n为正整数),请计算n的阶乘n!末尾所含有"0"的个数.    例如,5!=120,其末尾所含有的"0"的个数为1:10!= 3628800,其末尾所含有的"0"的个数为2:20!= 2432902008176640000,其末尾所含有的"0"的个数为4. 计算公式    这里先给出其计算公式,后面给出推导过程.    令f(x)表示正整数x末尾所含有的&q

CUDA 计算线程索引的一般公式

CUDA thread index: int blockId = blockIdx.z * (gridDim.x*gridDim.y)                    + blockIdx.y * gridDim.x                    + blockIdx.x; int threadId = blockId * (blockDim.x * blockDim.y * blockDim.z)                      + threadIdx.z * (blo

完成打印购物小票并计算积分

import java.util.Scanner; /** * @author 蓝色以太 * 完成打印购物小票并计算积分 */ public class ShoppingReceipt { public static void main(String[] args) { Scanner sc=new Scanner(System.in); final int NUM1=245,NUM2=570,NUM3=320; System.out.println("请输入购买T恤数量:"); in

python科学计算之numpy

1.np.logspace(start,stop,num): 函数表示的意思是;在(start,stop)间生成等比数列num个 eg: import numpy as np print np.logspace(1,4,4) 结果为: [    10.    100.   1000.  10000.] 2. np.fromstring('admin',dtype=np.int8):函数的作用是将字符串装换成对应的ascii值 import numpy as np print np.fromstr

计算两点间的距离

计算两点间的距离 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 208295    Accepted Submission(s): 72641 Problem Description 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离. Input 输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y