float xmin,xmax,ymin,ymax,xcenter,ycenter,radius; int simsPerFrame = 10000; color inside = color(255,0,0), outside = color(0,0,255); int countIn = 0, countTotal = 0; void setup() { size(600,700); xmin = 0; ymin = 100; xmax = width; ymax = height; xcenter = width/2; ycenter = (ymax-ymin)/2 + ymin; radius = width/2; background(255); ellipse(xcenter,ycenter,radius*2,radius*2); } void draw() { fill(255); rect(0,0,width,ymin); for(int i = 0; i < simsPerFrame; i++) { float x = random(xmin,xmax); float y = random(ymin,ymax); boolean in = dist(x,y,xcenter,ycenter) <= radius; if(in) { fill(inside); countIn++; }else { fill(outside); } countTotal++; noStroke(); ellipse(x,y,2,2); } fill(0); textAlign(LEFT,TOP); textSize(15); double ratio = countIn; ratio /= countTotal; text("Points inside: "+countIn+", points total: "+countTotal,10,10); text("Ratio: "+ratio,10,40); text("4*Ratio, or estimated value of PI: "+ratio*4,10,70); }
Estimating PI with Monte Carlo Simulation in Processing
Pi, π, can be computed using Monte Carlo simulation. Although that may sound complicated, it’s simpler than it sounds: Generate random points within a square, and see how many of them are inside of the circle (with the same diameter as the square’s side).
A mathematical proof of the computation goes like this: We know the ratio of the circle’s area to the square’s area is π*r*r/(2*r*2*r), since the area of a circle is π*r*r and a square is length_of_side*length_of_side, or (2*r*2*r). That equation, ratio_of_circle_to_square = π*r*r/(2*r*2*r), simplifies to ratio_of_circle_to_square = π/4. And so ratio_of_circle_to_square * 4 is equal to π.
The following code performs that simulation. It draws 100 dots at a time, and counts how many of those dots are red. The number of red dots, divided by the total number of dots, times four, is pi!
[raw]
[/raw]
Here is the code for the monte carlo simulation: