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
…