//: C03:Urand.h // From Thinking in C++, 2nd Edition // Available at http://www.BruceEckel.com // (c) Bruce Eckel 2000 // Copyright notice in Copyright.txt // Unique random number generator #ifndef URAND_H #define URAND_H #include #include template class Urand { int used[upperBound]; bool recycle; public: Urand(bool recycle = false); int operator()(); // The "generator" function }; template Urand::Urand(bool recyc) : recycle(recyc) { memset(used, 0, upperBound * sizeof(int)); srand(time(0)); // Seed random number generator } template int Urand::operator()() { if(!memchr(used, 0, upperBound)) { if(recycle) memset(used,0,sizeof(used) * sizeof(int)); else return -1; // No more spaces left } int newval; while(used[newval = rand() % upperBound]) ; // Until unique value is found used[newval]++; // Set flag return newval; } #endif // URAND_H ///:~