OpenANN  1.1.0
An open source library for artificial neural networks.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Random.h
Go to the documentation of this file.
1 
6 #ifndef OPENANN_UTIL_RANDOM_H_
7 #define OPENANN_UTIL_RANDOM_H_
8 
10 #include <cmath>
11 #include <cstdlib>
12 #include <algorithm>
13 
14 namespace OpenANN
15 {
16 
22 {
23 public:
36  void seed(unsigned int seed);
43  int generateInt(int min, int range) const;
49  size_t generateIndex(size_t size) const;
50 
58  template<class T>
59  T generate(T min, T range) const
60  {
61  OPENANN_CHECK(range >= T());
62  if(range == T())
63  return min;
64  else
65  return (T) rand() / (T) RAND_MAX * range + min;
66  }
67 
83  template<class T>
85  {
86  return std::sqrt(T(-2) * std::log(generate(T(), T(1)))) *
87  std::cos(T(2) * T(M_PI) * generate(T(), T(1)));
88  }
89 
97  template<class C>
98  void generateIndices(int n, C& result, bool initialized = false)
99  {
100  if(!initialized)
101  {
102  OPENANN_CHECK_EQUALS(result.size(), 0);
103  for(int i = 0; i < n; i++)
104  result.push_back(i);
105  }
106  else
107  {
108  OPENANN_CHECK_EQUALS(result.size(), (size_t) n);
109  }
110  std::random_shuffle(result.begin(), result.end());
111  }
112 
113  template<class M>
114  void fillNormalDistribution(M& matrix, double stdDev = 1.0)
115  {
116  const double* end = matrix.data() + matrix.rows() * matrix.cols();
117  for(double* p = matrix.data(); p < end; p++)
118  *p = sampleNormalDistribution<double>() * stdDev;
119  }
120 };
121 
122 } // namespace OpenANN
123 
124 #endif // OPENANN_UTIL_RANDOM_H_