蒙特卡洛法求pi(scala实现)

大数据入门学习Hadoop时有一个类似helloworld、wordcount的案例,就是案例jar包,用MapReduce计算pi,它的算法思想就是蒙特卡罗法。本次用scala实现一下。

蒙特卡洛法
大概意思就是说
概率:
有一随机事件,向方形区域投点,问落在圆形区域的概率
它服从均匀分布:可以表示为:圆形的面积/正方形的面积
频率:
现在做实验:
假设落在方形区域的点有m个,也即投点的总数
其中落在圆形的点有n个,m>n
那么这个频率可以用n/m表示

在样本次数或者说实验次数足够大时,满是条件
频率~=概率
用数学符号表示:设半径为r
蒙特卡洛法求pi(scala实现)
最后的求pi公式
蒙特卡洛法求pi(scala实现)

蒙特卡洛法求pi(scala实现)

**

蒙特卡洛法代码实现(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)
  }
}

最后的 结果
蒙特卡洛法求pi(scala实现)

相关文章: