这个好整,将坐标轴放到圆心,然后第一象限的1/4圆形就行,产生两组0-1均匀随机数,这个相当于随机投到第一象限的正方形区域内的点数,然后对于所有的点对计算到(0.0)的距离sqrt(x^2+y^2)是否小于半径1,然后计算小于半径的数目,然后除以总数,乘以4,代码如下:
good_pi<-function(N){
x=runif(N,0,1) #产生一组均匀随机数x范围0-1
y=runif(N,0,1) #产生一组均匀随机数y范围0-1
d=sqrt(x^2+y^2) #计算到原点的距离
M=length(subset(d,d<=1)) #判断产生的所有点中到原点的距离是否小于半径1
myPI=4*M/N
return(myPI)
}
good_pi(30000)
#为了产生稳定的估计值,可以多运行几次,然后求平均
duplicate<-sapply(1:1000,function(x){my_pi(30000)}) #测试1000次实验,每次投点30000个。
hist(duplicate)
mean(duplicate)
运行结果:
>good_pi(30000)
[1] 3.142533
> mean(duplicate)
[1] 3.14203 |