/* rngt - random and Gauss dist Kirillov 1992 */ #include "stdafx.h" #include #include #include /* uniform random number generator */ double rn(){ return(rand()/32767.); } /* Gauss with zero mean and std. dev. = 1. */ double sign(double x){ return( (x < 0.5) ? -1.0 : 1.0 ); } double gt(){ double u,u0,y; u=rn(); u0=rn(); if(u < 0.9195444) return(2.4037577*(u0+u*0.8253393)-2.1140281); else if(u >= 0.9654871) { do y=sqrt(4.4691147-2.*log(rn())); while (y*rn() > 2.1140281); return (y * sign(u0)); } else if(u >= 0.9499907) { do y=1.8403987+rn()*0.2736293; while (0.3989423*exp(-0.5*y*y)-0.4432991+y*0.2096941 < rn()*0.0427026); return (y * sign(u0)); } else if(u >= 0.9258523) { do y=0.2897296+rn()*1.5506692; while (0.3989423*exp(-0.5*y*y)-0.4432991+y*0.2096941 < rn()*0.0159745); return (y * sign(u0)); } else { do y=0.2897296*rn(); while (0.3989423*exp(-0.5*y*y)-0.3825446 < rn()*0.0163977); return (y * sign(u0)); } }