//: C05:Urand.h {-bor}
// Z knihy "Myslíme v jazyce C++, část 2" od Bruce Eckela a Chucka Allisona.
// (c) 1995-2004 MindView, Inc. Všechna práva vyhrazena.
// Přečtěte si podmínky používání zdrojových kódů umístěné v souboru 
// 'Licence.txt' dodávaném spolu s balíčkem kódu dostupným na www.MindView.net.
// Gemerátor jednoznačných náhodných čísel.
#ifndef URAND_H
#define URAND_H
#include <bitset>
#include <cstddef>
#include <cstdlib>
#include <ctime>
using std::size_t;
using std::bitset;

template<size_t HorniHranice> class Urand {
  bitset<HorniHranice> pouzite;
public:
  Urand() { srand(time(0)); } // Nahodné číslo
  size_t operator()(); // "generator" funkce
};

template<size_t HorniHranice>
inline size_t Urand<HorniHranice>::operator()() {
  if(pouzite.count() == HorniHranice)
    pouzite.reset();  // Začít znovu (vynulovat bitset)
  size_t novaHodnota;
  while(pouzite[novaHodnota = rand() % HorniHranice])
    ; // Dokud není nalezena jedinčná hodnota
  pouzite[novaHodnota] = true;
  return novaHodnota;
}
#endif // URAND_H ///:~
