# The worst pi generator?

This is the "dart method" of approximating pi, which is extremely slow to converge, but simple and fun to implement. To make things interesting, I tried writing it in Bash, which doesn't support floating point arithmetic.

``````#!/usr/bin/env bash

# This is a Monte Carlo approximation of pi. Imagine a circle of radius r. We
# repeatedly generate random points inside the circle's bounding square, and
# record how many points lie inside the circle. With some simple geometry, we
# find that pi ~= 4 * <points inside circle> / <total points>.

# Note: \$RANDOM gives a random integer between zero and the largest signed
# short (2^15 - 1), inclusive. So we'll give our circle a radius of half that
# (approximately, since we can't easily represent non-integers in Bash).

r=\$((2**14))
attempts=0
hits=0

function decimal_representation {
numerator=\$1
denominator=\$2

div=\$((numerator / denominator))
rem=\$((numerator % denominator))
decimals=\$((10000 * rem / denominator))

echo "\$div.\$decimals"
}

while :; do
x=\$((RANDOM - r))
y=\$((RANDOM - r))
if [ \$((x**2 + y**2)) -lt \$((r**2)) ]; then
let "hits += 1"
fi
let "attempts += 1"
echo -en "\r\$(decimal_representation \$((4 * hits)) \$attempts)"
done``````