Approximating Pi with Buffon’s Needle

I’m a bit late for Pi Day, but Programming Praxis had a neat problem on Friday that I wanted to check out:

Suppose we have a floor made of parallel strips of wood, each the same width, and we drop a needle onto the floor. What is the probability that the needle will lie across a line between two strips?

It turns out (as you might have guessed from the title) that the probability ends up being equal to 2/pi. How can we show that? Well in this case, I have a nice JavaScript simulation for you (down at the end of the post). The code is actually really straight forward:

// Drop a bunch of needles
var x1, y1, theta, x2, y2;
for (var i = 0; i < numberToDrop; i++) {
	// Drop a new needle
	x1 = (Math.random() * (width - 2 * needleLength)) + needleLength;
	y1 = (Math.random() * (height - 2 * needleLength)) + needleLength;
	theta = Math.random() * 2 * Math.PI;
 
	x2 = x1 + needleLength * Math.cos(theta);
	y2 = y1 + needleLength * Math.sin(theta);
 
	// Check if it crosses a line
	// Yes, this isn't the best way to do this
	var crossesLine = false;
	for (var x = needleLength / 2; x <= canvas.width; x += needleLength) {
		if ((x1 <= x && x <= x2) || (x2 <= x && x <= x1))
			crossesLine = true;
	}
 
	// Record the toss
	tossed += 1;
	if (crossesLine) crossed += 1;
}
 
console.log("pi ~ " + (2 * tossed / crossed));

I know that there are better ways to figure out if a needle crosses the line, but this works well enough. Plus, I wanted to make a really neat visualization. Speaking of which (note: red needles are crossing the line, blue are not):

Demo


Results

Simulation speed

stopped
slow (1.0 Hz)
normal (0.5 Hz)
fast (0.1 Hz)
very fast (0.01 Hz)
as fast as possible
even faster
light speed
ludicrous speed
...


All
By category