DiaDes  0.1
DIAgnosis of Discrete-Event System
Random.hh
Go to the documentation of this file.
1 #ifndef __DIADES__UTILS__RANDOM__HH__
2 #define __DIADES__UTILS__RANDOM__HH__
3 
13 #include<set>
14 #include<vector>
15 #include<list>
16 
17 using std::set;
18 using std::vector;
19 
20 
21 namespace Diades
22 {
23 
24  namespace Utils
25  {
27  double generateRandomDouble(double lower, double upper);
28 
29 
31  long generateRandomValue(long lower, long upper);
32 
36  unsigned initialiseSeed();
37 
39  void initialiseRandomGenerator(unsigned int seed);
40 
41 
51  void selectNValues(unsigned int min, unsigned int max, unsigned int n, set<unsigned> & result);
52 
53  /************************************************************************************/
54 
67  template <typename Iterator>
68  Iterator selectRandomElement(unsigned number,
69  Iterator first,
70  Iterator last)
71  {
72  if(number > 0)
73  {
74  unsigned selectedIndex = generateRandomValue(0,number-1);
75  unsigned index = 0;
76  while((first != last) && (index != selectedIndex))
77  {
78  ++first;
79  ++index;
80  }
81  if(first!=last)
82  {
83  return first;
84  }
85  else
86  {
87  return last;
88  }
89  }
90  return last;
91  }
92 
93  /************************************************************************************/
106  template <typename Iterator, typename Predicate>
108  Iterator last, Predicate pred)
109  {
110  if(first==last)
111  {
112  return last;
113  }
114  vector<Iterator> pointers;
115  for(Iterator it = first; it!=last; ++it)
116  {
117  if(pred(*it))
118  {
119  pointers.push_back(it);
120  }
121  }
122  if(pointers.empty())
123  {
124  return last;
125  }
126  unsigned selectedIndex = generateRandomValue(0,pointers.size()-1);
127  return pointers[selectedIndex];
128  }
129 
130 
131 
132  /************************************************************************************/
133 
144  template <typename InputIterator, typename Predicate, typename OutputIterator>
145  void selectNRandomElements(InputIterator first, InputIterator last,Predicate pred, unsigned number,OutputIterator out)
146  {
147 
148  if(first != last)
149  {
150  vector<InputIterator> pointers;
151  for(InputIterator it = first; it!=last; ++it)
152  {
153  if(pred(*it))
154  {
155  pointers.push_back(it);
156  }
157  }
158  if(number <= pointers.size())
159  {
160  set<unsigned> selection;
161  selectNValues(0, pointers.size() - 1, number , selection);
162  for(const unsigned & index : selection)
163  {
164  *out = *pointers[index];
165  ++out;
166  }
167  }
168  }
169  }
170  };
171 
172 };
173 #endif
void selectNRandomElements(InputIterator first, InputIterator last, Predicate pred, unsigned number, OutputIterator out)
Definition: Random.hh:145
unsigned initialiseSeed()
double generateRandomDouble(double lower, double upper)
void selectNValues(unsigned int min, unsigned int max, unsigned int n, set< unsigned > &result)
Namespace of the Diades project.
Iterator selectRandomElement(unsigned number, Iterator first, Iterator last)
Definition: Random.hh:68
ConstIterator on the Net.
void initialiseRandomGenerator(unsigned int seed)
long generateRandomValue(long lower, long upper)