Attached is a short write-up on the very interesting geometric probability problem commonly referred to as the Buffon’s Needle problem. The solution gives a general outline for a Monte Carlo method of approximating pi. neato!\
An R implementation of the monte carlo simulation is:
#Enter the desired number of trials as n Buffon_Needle<-function(n){ L=2;D=L; thetas<-c(rep(0,n)) for(i in 1:n){thetas[i]=runif(1,0,pi/2)} X<-c(rep(0,n)) for(i in 1:n){X[i]=runif(1,0,L/2) } COS<-c(rep(0,n)); COS=cos(thetas) Compare<-c(rep(0,n)) Compare=(X/(2/L)) Crossover<-c(rep(0,n)) for(i in 1:n){ if(COS[i]>=Compare[i]){Crossover[i]=1} if(COS[i]<Compare[i]){Crossover[i]=0} } Total=sum(Crossover) Pi_Est=(2*n)/Total cat("For ",n," trials the estimate of pi is: ",Pi_Est) } ######################################## Buffon_Needle(100)
A SAS implementation of the monte carlo simulation is:
%macro Buffon_Needle(n=); %let D=2; %let L=2; data BN; do i=1 to &n; angle=rand("Uniform",0,3.14159/2); X=rand("Uniform",0,&D/2); COS=cos(angle); L=&L; output; end; data BN; set BN; if(COS >=(X/(2/L))) then Cross = 1; else Cross = 0; proc sql; create table Results as select (sum(t1.Cross)) as Total_Crosses from work.BN t1; quit; data Results; set Results; n=&n; pi_est = (2*&n)/Total_Crosses; run; %mend; %Buffon_Needle(n=1000000);