| 
									
										
										
										
											2013-08-10 15:29:55 +00:00
										 |  |  | #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; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-01-04 15:35:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Generates evenly distributed numbers between 0 and 1. */ | 
					
						
							|  |  |  | float rran_() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return (float)rand()/(float)RAND_MAX; | 
					
						
							|  |  |  | } |