用hadoop计算PI值

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

百度一下,计算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的命令

[java] view plaincopyprint?

  1. <span style="white-space:pre">    </span>hadoop jar $HADOOP_HOME/hadoop-*-examples.jar pi 100 100000000

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

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

我运行的结果: 

三,总结

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

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

时间: 2024-10-05 01:38:39

用hadoop计算PI值的相关文章

使用随机数计算pi值--java实现

1.先上一张图 2.原理分析 上图展示的是,在二维坐标图中,半径为1的圆的1/4, 随机n个点(x坐标在0~1之间,并且y坐标在0~1之间),落在半径为1的圆内部,当点的样本足够多的时候,形成1/4的饼图. 3.代码实现 /** * */ package com.sunny.www.interview; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Scanner; /** * 使用随机数

Beam 超实用examples之Pi值计算

Beam Pi值计算 Beam刚刚开源不是很久,快2个月了.目前的版本是0.5.0版本.官方的源码中提供了4个examples.无奈这四个案例都只是WordCount的四种不同的实现.作为一个从Spark进入大数据殿堂的笔者来说,用过n多次的SparkPi的我,怎么能忍受竟然没有Pi实现的example呢.假如有了这个案例,可以非常方便的无论在开发工具中还是在集群中进行测试.于是便有了下文.笔者的文笔和技术有限.不足之处,还望朋友多多提建议.Let us come on . 我们先来讲讲Pi的实

初学Hadoop之计算TF-IDF值

1.词频 TF(term frequency)词频,就是该分词在该文档中出现的频率,算法是:(该分词在该文档出现的次数)/(该文档分词的总数),这个值越大表示这个词越重要,即权重就越大. 例如:一篇文档分词后,总共有500个分词,而分词”Hello”出现的次数是20次,则TF值是: tf =20/500=0.04 考虑到文章有长短之分,为了便于不同文章的比较,进行"词频"标准化. 或者 2.逆文档频率 IDF(inversedocument frequency)逆向文件频率,一个文档库

ffmpeg文档08-表达式计算/求值

8 表达式计算/求值 在计算表达式时,ffmpeg通过libavutil/eval.h接口调用内部计算器进行计算. 表达式可以包含一元运算符.运算符.常数和函数 两个表达式expr1和expr2可以组合起来成为"expr1;expr2" ,两个表达式都会被计算,但是新表达式(组合起来的)值实为表达式expr2的值. 表达式支持的二元运算符有:+,-,*,/,^ 一元运算符:+,- 以及下面的函数: abs(x) 返回x的绝对值. acos(x) 计算x反余弦 . asin(x) 计算x

计算pi的精度+进度条显示

步骤1:安装tqdm 首先,要打开cmd,输入指令,不断找到python文件的路径,知道找到Scripts,然后分别打入pip install pygame和pip install tqdm  如下图 步骤2:输入计算pi的代码(顺带输入一下跟进度条有关的代码): from random import random from math import sqrt from time import clock from tqdm import tqdm import time DARTS=800000

scala下使用akka计算pi

Akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java 和 Scala 的 Actor 模型应用.它已经成功运用在电信行业.系统几乎不会宕机(高可用性 99.9999999 % 一年只有 31 ms 宕机. 用akka计算pi,计算公式: 这样,我们把这个公式每连续的elements个分成一段,一共分成message段. 然后开worker个actor同时计算,把结果合并.算出最终结果和耗时. 一:计算某一段的actor 我们需要一个工作actor,用来计算某一段的

treetable 前台 累计计算树值 提交后台

treetable   累计计算树值 效果图 html  代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> &l

一起talk C栗子吧(第三十四回:C语言实例--巧用溢出计算最值)

各位看官们,大家好,上一回中咱们说的是巧用移位的例子,这一回咱们说的例子是:巧用溢出计算最值. 闲话休提,言归正转.让我们一起talk C栗子吧! 大家都知道,程序中的变量都有一个取值范围,这个范围也计算机和编译器都有关系.我们举个实际的例 子进行说明:在32位的计算机上,如果使用4个字节存储int类型的变量也就是说使用了32位的存储空间. 这时int类型变量的取值范围是:负2的32次方到正2的32次方-1,具体的数值是-2147483648到2147483647. 如果把不在这个范围内的数值赋

爪哇国新游记之二十二----算术表达式计算求值

代码: import java.util.ArrayList; import java.util.List; // 辅助类 class Item{ String value; boolean isNumber; public Item(String value,boolean isNumber){ this.value=value; this.isNumber=isNumber; } public Item(char c,boolean isNumber){ this.value=String.