Initial snark14m import
[snark14.git] / src / DIGRand / DIGGauss.cpp
1 /*      
2  THE POLAR METHOD FOR COMPUTING A NORMALLY DISTRIBUTED RANDOM
3  NUMBER GIVEN A UNIFORMLY DISTRIBUTED RANDOM NUMBER GENERATOR.
4  ALGORITHM P, PAGES 103-104
5  KNUTH, D. E. (1969)
6  THE ART OF COMPUTER PROGRAMMING - VOL 2
7  SEMINUMERICAL ALGORITHMS
8 */
9   
10 #include <cmath>
11
12 //#include "DIGRand.h"
13 #include <DIGRand/DIGRand.h>
14 //#include "DIGGauss.h"
15 #include <DIGRand/DIGGauss.h>
16
17     
18      
19 double Gauss(double mean, double std)
20 {
21   static bool    sw = false;
22   static double  s, v1, v2;
23
24   if(!sw) {
25     sw = true;
26     do {
27       v1 = (double) 2.0 * Rand() - (double) 1.0;
28       v2 = (double) 2.0 * Rand() - (double) 1.0;
29       s = v1 * v1 + v2 * v2;
30     }
31     while (s >= 1.0);
32
33     s = (double) sqrt((double) -2.0 * (double) log(s) / s);
34
35     return v1 * s * std + mean;
36   }
37
38   sw = false;
39
40   return v2 * s * std + mean;
41 }