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);