PyPO User Manual
Random.h
Go to the documentation of this file.
1 #include <random>
2 #include <iostream>
3 #include <string>
4 #include <vector>
5 
6 #define _USE_MATH_DEFINES
7 
8 #ifndef __Random_h
9 #define __Random_h
10 
11 /*! \file Random.h
12  \brief Class for generating random numbers.
13 
14  Generate object for creating random numbers for rejection sampling.
15  Currently only for Gaussian beams, but want to include Poisson disk sampling too.
16  If called empty, generate a random seed to use, which can be retrieved.
17  If called with seed, use that seed.
18 */
19 
20 /**
21  * Class for generating random numbers.
22  *
23  * Note that no function returns. All values are stored inside a variable which is passed by reference to the function.
24  */
25 template <typename T> class Random
26 {
27 private:
28  unsigned int seed;
29  std::mt19937 gen;
30 
31 public:
32  Random();
33  Random(unsigned int seed);
34 
35  T generateUniform(T lower = -1.0);
36  std::vector<T> generateUniform(int num, T lower = -1.0);
37 
38  T generateNormal(T stdev, T mean = 0.0);
39  std::vector<T> generateNormal(int num,
40  T stdev,
41  T mean = 0.0);
42 };
43 
44 /**
45  * Initialize RNG. This constructor generates a random seed for the random draws.
46  */
47 template <typename T>
49 {
50  std::random_device rd;
51  std::mt19937 geno(rd());
52  this->seed = rd();
53  this->gen = geno;
54 }
55 
56 /**
57  * Initialize RNG. This constructor takes a pre-set seed for the random draws.
58  *
59  * @param seed Positive integer determining the RNG seed.
60  */
61 template <typename T>
62 Random<T>::Random(unsigned int seed)
63 {
64  std::mt19937 geno(seed);
65  this->seed = seed;
66  this->gen = geno;
67 }
68 
69 /**
70  * Generate a random sample.
71  *
72  * @param lower Lower value of range. Defaults to -1.0.
73  *
74  * @returns out Number between lower and 1.0..
75  */
76 template <typename T>
78 {
79  std::uniform_real_distribution<T> dis(lower, 1.0);
80  return dis(this->gen);
81 }
82 
83 /**
84  * Generate multiple random samples.
85  *
86  * @param num Number of samples to return
87  * @param lower Lower value of range. Defaults to -1.0.
88  *
89  * @returns out Vector containing num uniform samples between lower and 1.0.
90  */
91 template <typename T>
92 std::vector<T> Random<T>::generateUniform(int num, T lower)
93 {
94  std::uniform_real_distribution<T> dis(lower, 1.0);
95  std::vector<T> out(num, 0);
96 
97  for (int n = 0; n < num; ++n) {
98  out[n] = dis(this->gen);
99  }
100  return out;
101 }
102 
103 /**
104  * Generate single sample from normal distribution.
105  *
106  * @param stdev Standard deviation of normal distribution.
107  * @param mean Mean of normal distribution. Defauts to zero.
108  *
109  * @returns out Draw of type T.
110  */
111 template <typename T>
112 T Random<T>::generateNormal(T stdev, T mean)
113 {
114  std::normal_distribution<T> dis(mean, stdev);
115  return dis(this->gen);
116 }
117 
118 /**
119  * Generate multiple random samples from normal distribution.
120  *
121  * @param num Number of samples to return
122  * @param stdev Standard deviation of normal distribution.
123  * @param mean Mean of normal distribution. Defauts to zero.
124  *
125  * @returns out Vector containing num normal samples.
126  */
127 template <typename T>
128 std::vector<T> Random<T>::generateNormal(int num,
129  T stdev,
130  T mean)
131 {
132  std::normal_distribution<T> dis(mean, stdev);
133  std::vector<T> out(num, 0);
134 
135  for (int n = 0; n < num; ++n) {
136  out[n] = dis(this->gen);
137  }
138  return out;
139 }
140 #endif
Definition: Random.h:26
T generateUniform(T lower=-1.0)
Definition: Random.h:77
T generateNormal(T stdev, T mean=0.0)
Definition: Random.h:112
Random()
Definition: Random.h:48