Pi的計算方式有很多,本文主要是通過Spark在概論統計的方法對Pi進行求解:

演算法說明:

  在邊長為R的正方形中,其面積為R^2,而其內接圓的面積為pi * R^2 /4 ,圓的面積與正方形的面積比為 Pi / 4 .

存在一個點,隨機的往這個正方形中掉落,而且這個點掉落到正方形的每個位置的概率是相同的,當無數多個點掉落在這個正方形時,那麼這個點在圓的個數x與在正方形上的個數y應該為圓的面積與正方形的面積之比Pi /4。

scala程式設計演算法:

  

import org.apache.spark.sql.SparkSession

import scala.math.random

object SparkPi {
def main(args: Array[String]): Unit = {
//step1:建立spark執行緒
val spark= SparkSession.builder.appName("Spark Pi").getOrCreate()
//step2: 設定引數
val slices = if(args.length>0) args(0).toInt else 2 //通過輸入的值判斷分片的個數,主要是設定執行緒數
val n = math.min(100000L * slices, Int.MaxValue).toInt //設定投遞的次數,也就是設定點的個數。當點的個數越大,求出的pi值越精確
//step3: 邏輯判斷 ,並統計落在圓這個面積中的次數
val count: Int = spark.sparkContext.parallelize(1 until n, slices).map {
i =>
val x = random * 2 - 1
val y = random * 2 - 1
if (x * x + y * y <= 1) 1 else 0 //定義隨機點,判斷點是否落在圓內,若不在,則為0,否則則取1
}.reduce(_ + _)

//通過公式pi = 4.0 * (圓中的次數)/ 總的次數
println(s"Pi is roughly ${4.0 * count/(n-1)}")
spark.stop()
}