以前也知道蒙特卡洛投针求PI,今天安装spark,安完先要试试他自带的几个小程序看看能不能用,我主要会用python写程序,也就是pyspark所以在spark里的examples目录深处找python的文件夹,里面的pi.py就是。看了一下源码是这样的:
import sys
from random import random
from operator import add
from pyspark import SparkContext
if __name__ == "__main__":
""" Usage: pi [partitions] """
sc = SparkContext(appName="PythonPi")
partitions = int(sys.argv[1]) if len(sys.argv) > 1 else 2
n = 100000 * partitions
def f(_):
x = random() * 2 - 1
y = random() * 2 - 1
return 1 if x ** 2 + y ** 2 < 1 else 0
count = sc.parallelize(range(1, n + 1), partitions).map(f).reduce(add)
print("Pi is roughly %f" % (4.0 * count / n)) sc.stop()
跑了一下效果还是不错的,结果每次都不一样但在3.14附近,当然他用MapReduce,我也可以写一个不用分布计算的嘛,然后拿C++写了一个:
#include <iostream> #include <cmath> #include <stdlib.h> using namespace std; int main() { int n; cout<<"键入模拟投针次数:\n"; cin>>n; int in_circle_cnt=0; for(int i=0;i<=n;i++) { double x=(double(rand()%1000)/1000.0)*2-1; double y=(double(rand()%1000)/1000.0)*2-1; double dist=x*x+y*y; if(dist<=1.0) in_circle_cnt++; } cout<<"PI值约为:"<<4.0*double(in_circle_cnt)/double(n)<<endl; return 0; }
意思是到了,效果很差模拟上亿次也不太好,而且相同输入每次都一样结果,当然了,差别就在随机函数上了,我C++里用的是C标准库的伪随机表,而python的随机函数random()要优秀的多,才能尽量造成随机且均匀分布的感觉。