KrisLibrary  1.0.0
math/random.h
Go to the documentation of this file.
1 #ifndef MATH_RANDOM_H
2 #define MATH_RANDOM_H
3 
4 #include <KrisLibrary/utils/random.h>
5 #include "math.h"
6 
21 template <class RNG>
22 float frand_gaussian(RNG& rng);
23 template <class RNG>
24 double drand_gaussian(RNG& rng);
25 
26 namespace Math {
29 
30 extern StandardRNG rng;
31 inline void Srand(unsigned long seed) { rng.seed(seed); }
32 inline long int RandInt() { return rng.randInt(); }
33 inline long int RandInt(long int n) { return rng.randInt(n); }
34 
35 #ifdef MATH_DOUBLE
36 inline Real Rand() { return rng.randDouble(); }
37 inline Real Rand(Real a,Real b) { return rng.randDouble(a,b); }
38 inline Real RandGaussian() { return drand_gaussian(rng); }
39 inline Real RandGaussian(Real mean, Real stddev) { return RandGaussian()*stddev+mean; }
40 #else
41 inline Real Rand() { return rng.randFloat(); }
42 inline Real Rand(Real a,Real b) { return rng.randFloat(a,b); }
43 inline Real RandGaussian() { return frand_gaussian(rng); }
44 inline Real RandGaussian(Real mean, Real stddev) { return RandGaussian()*stddev+mean; }
45 #endif //MATH_DOUBLE
46 
47 inline bool RandBool() { return rng.randInt() < (rng.maxValue()/2); }
48 inline bool RandBool(Real p) { return Rand() < p; }
49 
83 } //namespace Math
84 
85 
86 
87 //definition of rand_gaussian functions
88 
89 template <class RNG>
90 float frand_gaussian(RNG& rng)
91 {
92  static float t = 0.0f;
93  float x,v1,v2,r;
94  if (t == 0) {
95  do {
96  v1 = 2.0f * rng.randFloat() - 1.0f;
97  v2 = 2.0f * rng.randFloat() - 1.0f;
98  r = v1 * v1 + v2 * v2;
99  } while (r>=1.0f);
100  r = sqrtf((-2.0f*logf(r))/r);
101  t = v2*r;
102  return (v1*r);
103  }
104  else {
105  x = t;
106  t = 0.0f;
107  return (x);
108  }
109 }
110 
111 template <class RNG>
112 double drand_gaussian(RNG& rng)
113 {
114  static double t = 0.0;
115  double x,v1,v2,r;
116  if (t == 0) {
117  do {
118  v1 = 2.0 * rng.randDouble() - 1.0;
119  v2 = 2.0 * rng.randDouble() - 1.0;
120  r = v1 * v1 + v2 * v2;
121  } while (r>=1.0);
122  r = sqrt((-2.0*log(r))/r);
123  t = v2*r;
124  return (v1*r);
125  }
126  else {
127  x = t;
128  t = 0.0;
129  return (x);
130  }
131 }
132 
133 #endif
Common math typedefs, constants, functions.
long int RandInt()
Generates a random int.
Definition: math/random.h:32
bool RandBool()
Generates a random boolean that is true with probability 0.5.
Definition: math/random.h:47
Real Rand()
Generates a random Real uniformly in [0,1].
Definition: math/random.h:36
Contains all definitions in the Math package.
Definition: WorkspaceBound.h:12
Interface for a random number generator.
Definition: utils/random.h:25