29 lines
		
	
	
		
			599 B
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			29 lines
		
	
	
		
			599 B
		
	
	
	
		
			C
		
	
	
	
	
	
|  | #include <stdlib.h>
 | ||
|  | #include <math.h>
 | ||
|  | 
 | ||
|  | /* Generate gaussian random float with mean=0 and std_dev=1 */ | ||
|  | float gran_() | ||
|  | { | ||
|  |   float fac,rsq,v1,v2; | ||
|  |   static float gset; | ||
|  |   static int iset; | ||
|  | 
 | ||
|  |   if(iset){ | ||
|  |     /* Already got one */ | ||
|  |     iset = 0; | ||
|  |     return gset; | ||
|  |   } | ||
|  |   /* Generate two evenly distributed numbers between -1 and +1
 | ||
|  |    * that are inside the unit circle | ||
|  |    */ | ||
|  |   do { | ||
|  |     v1 = 2.0 * (float)rand() / RAND_MAX - 1; | ||
|  |     v2 = 2.0 * (float)rand() / RAND_MAX - 1; | ||
|  |     rsq = v1*v1 + v2*v2; | ||
|  |   } while(rsq >= 1.0 || rsq == 0.0); | ||
|  |   fac = sqrt(-2.0*log(rsq)/rsq); | ||
|  |   gset = v1*fac; | ||
|  |   iset++; | ||
|  |   return v2*fac; | ||
|  | } |