/*-------------------------------------------------------------------------- Author: Thomas Nowotny Institute: Institute for Nonlinear Dynamics University of California San Diego La Jolla, CA 92093-0402 email to: tnowotny@ucsd.edu initial version: 2002-03-08 --------------------------------------------------------------------------*/ #include "gauss.h" randomGauss::randomGauss() { time_t t0= time(NULL); assert (t0 != -1); ulong seed1= t0; ulong seed2= t0%131313; ulong seed3= t0%171717; UniGen.srand(seed1, seed2, seed3); s= 0.449871; t= -0.386595; a= 0.19600; b= 0.25472; r1= 0.27597; r2= 0.27846; } double randomGauss::n() { do { done= 1; do {u= ((double) UniGen.rand())/ULONG_MAX;} while (u == 0.0); v= ((double) UniGen.rand())/ULONG_MAX; v= 1.7156 * (v - 0.5); x= u - s; y= fabs(v) - t; q= x*x + y*(a*y - b*x); if (q < r1) done= 1; else if (q > r2) done= 0; else if (v*v > -4.0*log(u)*u*u) done= 0; } while (!done); return v/u; }