double random_position(void) { /* Not perfectly uniformly distributed but sufficient: return a random floating point value in range [-1.0; +1.0]. */ return ((double) rand() / RAND_MAX) * 2.0 - 1.0; } int is_in_circle(double x, double y) { /* Pythagoras was here: x^2 + y^2 = r^2 */ return x * x + y * y <= 1.0; } double monte_carlo_pi(int iterations) { int in_square_count = 0; int in_circle_count = 0; while (iterations-- > 0) { double x = random_position(); double y = random_position(); if (is_in_circle(x, y)) { ++in_circle_count; } else { ++in_square_count; } } if (in_square_count > 0) { return 4.0 * in_circle_count / in_square_count; } /* Not found. */ return -1.0; }