蒙特卡洛法求pi(scala实现)
大数据入门学习Hadoop时有一个类似helloworld、wordcount的案例,就是案例jar包,用MapReduce计算pi,它的算法思想就是蒙特卡罗法。本次用scala实现一下。
蒙特卡洛法
大概意思就是说
概率:
有一随机事件,向方形区域投点,问落在圆形区域的概率
它服从均匀分布:可以表示为:圆形的面积/正方形的面积
频率:
现在做实验:
假设落在方形区域的点有m个,也即投点的总数
其中落在圆形的点有n个,m>n
那么这个频率可以用n/m表示
在样本次数或者说实验次数足够大时,满是条件
频率~=概率
用数学符号表示:设半径为r
最后的求pi公式
**
蒙特卡洛法代码实现(scala)
**
import scala.collection.mutable.ArrayBuffer
import scala.util.Random
object montecarloForPi {
def fun(num:Int):Double={
val randomnum = new Random()
val loop = (1 to num)
var count = 0
loop.foreach(_ => {
val (x,y) =(randomnum.nextFloat(),randomnum.nextFloat())//模拟点,点范围(0-1)
val disToCenter = Math.sqrt(Math.pow(x,2)+Math.pow(y,2))//点到圆心的距离公式
if (disToCenter <= 1.0) count +=1 //点是否在圆内判断条件
})
(count*4) *1.0000/num //核心,1.0000用来精度调整
}
def main(args: Array[String]): Unit = {
//pi = fun(1000000)
//为提高精度,维持在3.14,做了求多次pi,求均值。
val piArr = ArrayBuffer[Double]()
val loop = (1 to 100)
loop.foreach(_ =>
{
piArr += fun(1000000)
})
val pimean = piArr.sum/piArr.size//对所有的pi求均值
println(pimean)
}
}
最后的 结果