/* * estimate pi using Monte Carlo method: * simulate throwing "darts" into a board with a quarter-circle * of radius 1 set in a square of size 1 * ratio of darts that fall inside the quarter-circle to total * number of darts approximates ratio of areas -- i.e., pi/4. * input is number of "samples" (darts) and "seed" for PRNG */ #include #include #include #include /* copied from not-strictly-standard part of math.h */ #define M_PI 3.14159265358979323846 int main(void) { int samples; int seed; printf("how many samples? maximum %d\n", INT_MAX); if ((scanf("%d", &samples) != 1) || (samples <= 0)) { printf("invalid input\n"); return EXIT_FAILURE; } printf("seed for RNG? maximum %d\n", INT_MAX); if ((scanf("%d", &seed) != 1) || (seed <= 0)) { printf("invalid input\n"); return EXIT_FAILURE; } srand((unsigned int) seed); int count = 0; double x, y; for (int i = 0; i < samples; ++i) { x = (double) rand() / (double) (RAND_MAX); y = (double) rand() / (double) (RAND_MAX); if ((x*x + y*y) <= 1.0) ++count; } double pi = 4.0 * (double) count / (double) samples; printf("results with %d samples, seed %d:\n", samples, seed); printf("computed pi = %g (%17.15f)\n",pi, pi); printf("difference between computed pi and math.h M_PI = %17.15f\n", fabs(pi - M_PI)); return EXIT_SUCCESS; }