/* starasc.c */ #include <stdio.h> #include <stdlib.h> #include <limits.h> #include <tgmath.h> #include <values.h> #include "starasc.h" int main ( void ) { int i, n = 0; double r; for (i = 0; i < 100; i ++) { r = gaussrand(); if (abs(r) < 1.0) ++ n; /* printf("%e\n", r); */ } printf("%d/%d\n", n, i); exit(0); } /*******************************************************************/ /* http://c-faq.com/lib/gaussian.html */ double gaussrand() { static double V1, V2, S; static int phase = 0; double X; if (phase == 0) { do { double U1 = (double) rand() / RAND_MAX; double U2 = (double) rand() / RAND_MAX; V1 = 2 * U1 - 1; V2 = 2 * U2 - 1; S = V1 * V1 + V2 * V2; } while ( S >= 1 || S == 0); X = V1 * sqrt(-2 * log(S) / S); } else X = V2 * sqrt(-2 * log(S) / S); phase = 1 - phase; return X; }