Have you ever heard about the Buffon's needle?

This is a very interesting experiment. In a nutshell, it is a fun approximative method to calculate the value of π.

Watch this video to understand what is going on:

The code:

import sys import math import random def get_random(l, k): return random.random()*(l - 2*k) + k def get_point(w, h, k): return (get_random(w, k), get_random(h, k)) def get_angle(): return random.random()*2*math.pi def intercept(p1, p2, h, k): for line in range(0, h+1, k): if (line >= p1[1] and line <= p2[1]) or \ (line <= p1[1] and line >= p2[1]): return True def drop_and_check(w, h, k): p1 = get_point(w, h, k) angle = get_angle() p2 = (p1[0] + (k/2.0)*math.cos(angle), p1[1] + (k/2.0)*math.sin(angle)) return intercept(p1, p2, h, k) def repeat(times): w = h = 1000 k = 10 count = 0 for i in range(times): if drop_and_check(w, h, k): count += 1 return float(times)/count if __name__ == "__main__": print(repeat(int(sys.argv[1])))

It is available via github too.

Hope you liked it! =)

Ronald Kaiser