Aleph-w  1.5a.2
Biblioteca general de algoritmos y estructuras de datos
 Todo Clases Archivos Funciones Variables 'typedefs' Enumeraciones Amigas Grupos Páginas
tpl_random_queue.H
1 
2 # ifndef TPL_RANDOM_QUEUE_H
3 # define TPL_RANDOM_QUEUE_H
4 
5 # include <gsl/gsl_rng.h>
6 # include <tpl_dynArray.H>
7 
8 namespace Aleph {
9 
22  template <class T>
24 {
25 private:
26 
27  DynArray<T> array;
28  gsl_rng * r;
29 
30 public:
31 
35  typedef T Item_Type;
36 
38  gsl_rng * get_rng() const { return r; }
39 
41  Random_Set() : array(0), r(NULL)
42  {
43  r = gsl_rng_alloc (gsl_rng_mt19937);
44  if (r == NULL)
45  throw std::bad_alloc();
46 
47  gsl_rng_set(r, time(NULL) % gsl_rng_max(r));
48  }
49 
50  ~Random_Set()
51  {
52  if (r != NULL)
53  gsl_rng_free(r);
54  }
55 
58  void put(const T & item) { array[array.size()] = item; }
59 
63  T get()
64  {
65  if (array.size() == 0)
66  throw std::underflow_error("Random set is empty");
67 
68  const size_t pos = gsl_rng_uniform_int(r, array.size()); // al azar
69  T ret_val = array.access(pos);
70  array.access(pos) = array.access(array.size() - 1);
71  array.cut(array.size() - 1);
72  return ret_val;
73  }
74 
76  bool is_empty() const { return array.size() == 0; }
77 };
78 
79 } // end namespace Aleph
80 
81 # endif // TPL_RANDOM_QUEUE_H
82 
void put(const T &item)
Definition: tpl_random_queue.H:58
T Item_Type
El tipo de elemento que retorna get_current().
Definition: tpl_random_queue.H:35
gsl_rng * get_rng() const
Retorna el generador de números aleatorios.
Definition: tpl_random_queue.H:38
Definition: tpl_random_queue.H:23
Random_Set()
Instancia una cola aleatoria.
Definition: tpl_random_queue.H:41
Random_Set Set_Type
El tipo de conjunto sobre el cual se itera.
Definition: tpl_random_queue.H:33
Definition: tpl_dynArray.H:70
bool is_empty() const
retorna true si la cola aleatoria está vacía.
Definition: tpl_random_queue.H:76

Leandro Rabindranath León