文档章节

java计算圆周率

z
 zongze30
发布于 2015/02/13 10:14
字数 650
阅读 31
收藏 0

一、理论篇

1. 数学公式

圆面积公式:π*r*r,其中π为圆周率,r为圆半径;

正方形面积公式:s*s,其中s为边长;

勾股定理:a*a + b*b = c*c,其中a/b分别为直角三角形的两个直角边,c为斜边。

2. 计算方法

考虑下图,边长为r的正方形内嵌了一个以r为半径的1/4圆。

image

InsideCircle面积 = 以r为半径的圆面积 / 4 = π*r*r/4

正方形面积 = r*r

所以, InsideCircle面积 / 正方形面积 = (π*r*r/4) / (r*r) = π/4

面由线组成,线由点组成。因此,如果有若干点均匀落入到正方形中,那么落入InsideCircle的点的个数占总数的比率也将会是π/4,由此将会统计出π的值。

 

二、实战篇

1. 散弹枪计算

具体方式为:制作一个如上图一样正方形木板,用散弹枪对着它一顿乱扫,最后统计弹孔个数和落点,从而得出π的值。

事实上,真的有研究人员做过这个脑洞大过黑洞的实验,他们在 30857 个样本中得到了 3.13 这个还算不错的结果。

详见:http://www.techug.com/compute-pi-with-gun

2. Java随机数计算

作为一个码农,当然玩不起散弹枪这种高级玩具,那么接下来就以代码来玩一把。

具体思路是这样的:r直接取值为1.0,还需要定义一个落在正方形中的所有点的个数PointNumber,每一个点都有一个坐标(x,y),x,y取值为0.0-1.0,利用Java随机数生成每个点,然后用勾股定理判断该点是落在圆内还是圆外,并统计落在圆内的点的个数InsideCircleNumber,那么π=InsideCircleNumber/PointNumber*4。当然,如果只计算一次的话,可能误差会较大,可以再增加一个计算次数CalcTimes,然后求平均值。

按照这样的思路的计算结果如下:

PointNumber

CalcTimes

π

最接近π的值

10000

10000

3.141617279999959

3.1416

100000

10000

3.1415569599999684

3.1416

1000000

10000

3.1415845499999953

3.141592

10000000

10000

3.1415924761886806

3.1415928

附源代码:

package com.test.pai;
import org.apache.commons.lang.math.RandomUtils;
public class CalcPai           
{            
    public static boolean inCircle(double x, double y)            
    {            
        return (y <= Math.sqrt(1 - x * x));            
    }
    public static double CalcPaiByPointNumber(long num)           
    {            
        double inCircleNum = 0.0;            
        for (long i = 0; i < num; i++)            
        {            
            if (CalcPai.inCircle(RandomUtils.nextDouble(), RandomUtils.nextDouble()))            
            {            
                inCircleNum++;            
            }            
        }
        double pai = inCircleNum * 4 / num;
        return pai;           
    }
    public static void main(String[] args)           
    {            
        double realPai = 3.14159265;            
        CurrResult currResult = new CurrResult(0.0, realPai, 0.0);            
        long times = 10000;            
        long num = 1000000;            
        for (long i = 1; i <= times; i++)            
        {
            double pai = CalcPai.CalcPaiByPointNumber(num);           
            currResult.setTotalPai(currResult.getTotalPai() + pai);            
            double diff = Math.abs(realPai - pai);            
            if (diff < currResult.getDifference())            
            {            
                currResult.setCurrPai(pai);            
                currResult.setDifference(diff);            
            }
            System.out.println("No." + i + "/" + times + "\t" + pai + "\t" + currResult.getCurrPai() + "\t"           
                    + currResult.getTotalPai() / i);            
        }
    }
}

转自:http://blog.csdn.net/xuejiaqiang88/article/details/43791703

本文转载自:http://blog.csdn.net/xuejiaqiang88/article/details/43791703

共有 人打赏支持
z
粉丝 0
博文 7
码字总数 1170
作品 0
石家庄
3月14日圆周率日—使用并行计算求圆周率π

关于圆周率大家再熟悉不过了: 我们从课本上学习到早在一千多年前,祖冲之将圆周率计算到3.1415926到3.1415927之间…计算机诞生后,计算圆周率被用来检测计算机的硬件性能,昼夜燃烧cpu看会不...

fourinone
2013/03/14
0
25
Java:大数据技术领域的一匹黑马

诞生于1991年的Java如今已经成为世界范围内应用最为广泛的编程语言之一。在今天的文章中,我们将共同了解Java所拥有的七大关键新特性,展望其如何在未来的超级计算、大数据以及物联网等领域继...

Java大数据处理
04/22
0
0
Java规范面临第二次分裂危机

其实这样的危机对于Java来说已经不是第一次了,在上个世纪90年代后期,也就是Java刚刚出现不长时间就遇到了第一次危机。当时微软为了 跟SUN之间争夺Java的事实标准权,开发了自己特有的版本V...

walkerxk
2010/06/01
0
0
利用javax.tools动态编译执行java代码

 本文永久地址:https://my.oschina.net/bysu/blog/1552933 inkfish原创,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish )。   参考:使用 javax.tools 创建动态应用...

不最醉不龟归
2017/10/18
0
0
什么是Java语言?java语言简介

Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言(以下简称Java语言)和Java平台的总称。用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动态的W...

阿秀a
2010/10/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Future,Thread,Callable,Executors.newXXXThreadPool

package cunrent.future;import java.util.concurrent.*;public class FutureCook { public static void main(String[] args) throws InterruptedException, ExecutionExcept......

noteman
21分钟前
2
0
shing boot 做session共享 redis

因为多台服务器负载均衡,在获取客户端的sessionId的时候,会出现第一次和第二次不一样,因为负载均衡的缘故,你的服务器最少两台,那么客户端连接第一次请求和第二次请求如果不是同一台服务...

小马_wolf
25分钟前
1
0
【Springboot+mybatis】 解析Excel并批量导入到数据库

【Springboot+mybatis】 解析Excel并批量导入到数据库置顶 2018年01月16日 20:05:52 冉野丶 阅读数:4060 标签: excel导入数据库 文件上传 excel解析 更多个人分类: POI 工作问题归纳...

奥特曼之王
27分钟前
2
0
Mac OS下安装Axure RP 8.0.0.3312 中文破解版

Mac下一款快速原型设计工具——Axure RP,有了它可以大大提高你的工作效率。此次带来的是Axure RP 8.0.0.3312 版本。 介绍 Axure RP 能帮助网站需求设计者,快捷而简便的创建基于网站构架图的...

james_laughing
29分钟前
1
0
【Guava】使用Guava的RateLimiter做限流

一、常见的限流算法 目前常用的限流算法有两个:漏桶算法和令牌桶算法。 1.漏桶算法 漏桶算法的原理比较简单,请求进入到漏桶中,漏桶以一定的速率漏水。当请求过多时,水直接溢出。可以看出...

大海201506
31分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部