用hadoop计算PI值,hadoop计算PI值

一、计算PI值的方式与原理

&">nbsp;     百度一下,计算PI的方法还真不少。但在hadoop examples代码中的注释写的是:是采用 Quasi-Monte Carlo 算法来估算PI的值。

维基百科中对Quasi-Monte Carlo的描述比较理论,好多难懂的公式。

好在google了一把,找到了斯坦福大学网站上的一篇文章:《通过扔飞镖也能得出PI的值?》,文章很短,图文并茂,而且很好理解。

我这里将那篇文章的重要部分截了个图:

对上面的图再稍微解释一下: 
      1、Figure2是Figure1的右上角的部分。 
      2、向Figure2中投掷飞镖若干次(一个很大的数目),并且每次都仍在不同的点上。 
      3、如果投掷的次数非常多,Figure2将被刺得“千疮百孔”。 
      4、这时,“投掷在圆里的次数”除以“总投掷次数”,再乘以4,就是PI的值!(具体的推导过程参见原文)

在这个算法中,很重要的一点是:如何做到“随机地向Figure2投掷”,就是说如何做到Figure2上的每个点被投中的概率相等。

hadoop examples代码中,使用了Halton sequence保证这一点,关于Halton sequence,大家可以参考维基百科。

我这里再总结一下Halton sequence的作用: 在1乘1的正方形中,产生不重复,并且均匀的点。每个点的横坐标和纵坐标的值都在0和1之间。 正是这样,保证了能够做到“随机地向Figure2投掷”。

有人总结了一下,这个实际上叫做蒙特卡洛算法,我们取一个单位的正方形(1×1) 里面做一个内切圆(单位圆),则 单位正方形面积 : 内切单位圆面积 = 单位正方形内的飞镖数 : 内切单位圆内的飞镖数 ,通过计算飞镖个数就可以把单位圆面积算出来, 通过面积,在把圆周率计算出来。 注意 ,精度和你投掷的飞镖次数成正比。

二,运行hadoop估算PI的命令

后面2个数字参数的含义: 
     第1个100指的是要运行100次map任务 
     第2个数字指的是每个map任务,要投掷多少次

2个参数的乘积就是总的投掷次数。

我运行的结果:

三,总结

hadoop的examples中的计算PI的方法属于是采用大量采样的统计学方法,还是属于数据密集型的工作。

转载请注明出处: http://www.ming-yue.cn/hadoop-pi/

怎计算PI的精确值?

作单位圆,再作其内接正N边形(N为2的正整数次方)先计算其内接正N边形周长,可用公式C=N*2R*sin(180/N)计算,其中R为单位圆半径1。sin(180/N)可以连用N次半角公式计算(因为N为2的正整数次方)最后用C/2便可得出圆周率的近似值(因为N可以无限大的取值,所以我们可以无限接近圆周率)

Hadoop做什计算
合适?

主要针对大块的数据文件,最好是数据规模上G、T级别的,hadoop把大块数据进行切割并进行分布式存储,对小块数据由于系统开销等原因处理速度并不一定比单个串行程序明显。此外,hadoop的mapreduce计算模型通过map任务会产生中间结果文件,reduce任务在处理这些中间结果文件形成最终结果文件并输出。由 于中间结果文件是存储在各个分布式计算节点本地内存或磁盘上的,如果计算产生的中间结果文件非常巨大,reduce过程需要通过远程过程调用来取得这些中 间结果文件,会加大网络传输的开销,则不适合采用hadoop处理。所以对于是否何时采用hadoop来处理数据,上面讲的两点是必须考虑的问题,对于大规模数据的统计分析,例如求期望方差、或者对海量数据的分布式查询适合用hadoop来做。呵呵~~不知是否解答清楚了你的问题

时间: 2024-10-27 13:48:46

用hadoop计算PI值,hadoop计算PI值的相关文章

请高人指点下 pi 衰减器的计算反算代码.谢谢

问题描述 帮忙指点下pi衰减器的计算反算代码.谢谢知道R1,R2,R3的阻值,计算出这个衰减了多少db,匹配阻抗是多少Z0=Z1可以加多悬赏!图片如下连接

php计算多维数组中所有值总和的方法

本文实例讲述了php计算多维数组中所有值总和的方法.分享给大家供大家参考.具体实现方法如下: php 内置函数 array_sum() 函数返回数组中所有值的总和,只能返回一维数组的总和; 计算多维数组所有值的和就要自定义函数了; ? 1 2 3 4 5 6 7 8 9 10 function get_sum($array) { $num = 0; foreach($array as $k => $v) { if(is_array($v)) { $num += get_sum($v); } }

c-输入一个双精度实数x,计算并输出下式的值

问题描述 输入一个双精度实数x,计算并输出下式的值 /*输入一个双精度实数x,计算并输出下式的值,直到最后一项的绝对值小于10-5(保留两位小数),s=x-x2/2!+x3/3!-x4/4!+- 说明:(1)scanf之前无需用printf给提示信息. (2)求和结果用"%.2f"控制输出格式.*/ #include #include int main() { int i,n,fac=1,sign=1; double sum=0,x,tem=0; scanf("x=%lfn&

mfc-MFC多线程计算浮点数组,关于返回值的自动保存

问题描述 MFC多线程计算浮点数组,关于返回值的自动保存 MFC多线程计算浮点数组,返回值能不能进行自动保存,并且如果出错,就自动恢复执行计算? 解决方案 你可以把结果保存到外部文件中,然后重新执行就从文件中读取. 解决方案二: 你想要保存到哪里?出错指的是什么出错?程序崩溃,要捕获异常,重新执行计算?

智能指针-c++ excel dll 数组输入后如何对数组元素值进行计算?

问题描述 c++ excel dll 数组输入后如何对数组元素值进行计算? 问题是这样的 IDE:visual c++ 2013 community excel:2010 目的:编写excel dll 目前阶段:实现了在excel中单元格输入,单元格输出的函数编写,如a+b 现在想要尝试数组/矩阵输入后,经过一定的计算,以数值输出到单元格,如得到这个数组所有元素的总和之类的. 已知输入 #import "C:Program Files (x86)Common Filesmicrosoft sha

javascript-关于css matrix3d值的计算问题 js大神帮忙下哈

问题描述 关于css matrix3d值的计算问题 js大神帮忙下哈 transform: rotateX(140deg) rotateY(-17deg) rotateZ(-125deg) translateX(150px) translateZ(-200px); css这样的样式 js取出来后是这样的: matrix3d(-0.548513873990834, 0.735300759939884, -0.398077030826192, 0, 0.783358995810406, 0.2854

矩阵 排序-计算矩阵中d(i)的值,d为矩阵中所有点值的一个排序

问题描述 计算矩阵中d(i)的值,d为矩阵中所有点值的一个排序 解决方案 图太小,什么也看不见.无非就是二维数组循环,自己写下不难的.

php计算多维数组中所有值总和的方法_php技巧

本文实例讲述了php计算多维数组中所有值总和的方法.分享给大家供大家参考.具体实现方法如下: php 内置函数 array_sum() 函数返回数组中所有值的总和,只能返回一维数组的总和: 计算多维数组所有值的和就要自定义函数了: function get_sum($array) { $num = 0; foreach($array as $k => $v) { if(is_array($v)) { $num += get_sum($v); } } return $num + array_sum

php计算2个日期的差值函数分享_php实例

非常简单实用的函数分享给大家, 奉上代码: 复制代码 代码如下: /**      *    日期-计算2个日期的差值      *  @return int      */     public function get_difference($date, $new_date) {         $date = strtotime($date);         $new_date = strtotime($new_date);         return abs(ceil(($date

[20171227]表的FULL_HASH_VALUE值的计算.txt

[20171227]表的FULL_HASH_VALUE值的计算.txt --//sql_id的计算是使用MD5算法进行哈希,生成一个128位的Hash Value,其中低32位作为HASH VALUE显示,SQL_ID则取了后64位. --//实际上sql_id使用32进制表示,hash_value使用10进制表示. --//我在链接提到http://blog.itpub.net/267265/viewspace-2142512/内容: --//如果使用md5sum计算的结果,按照4位一组,大小