50 #include <boost/random/variate_generator.hpp> 
   51 #include <boost/random/uniform_int.hpp> 
   52 #include <boost/random/uniform_real.hpp> 
   53 #include <boost/random/triangle_distribution.hpp> 
   54 #include <boost/random/cauchy_distribution.hpp> 
   55 #include <boost/random/exponential_distribution.hpp> 
   56 #include <boost/random/geometric_distribution.hpp> 
   57 #include <boost/random/normal_distribution.hpp> 
   58 #include <boost/random/lognormal_distribution.hpp> 
   59 #include <boost/random/mersenne_twister.hpp> 
   60 #include <boost/cstdint.hpp> 
   65 typedef boost::variate_generator<boost::mt19937&, boost::uniform_real<> > _RealUniformGenerator;
 
   66 typedef boost::variate_generator<boost::mt19937&, boost::uniform_int<> > _IntUniformGenerator;
 
   68 typedef boost::variate_generator<boost::mt19937&, boost::triangle_distribution<> > _TriangleGenerator;
 
   69 typedef boost::variate_generator<boost::mt19937&, boost::cauchy_distribution<> > _CauchyGenerator;
 
   70 typedef boost::variate_generator<boost::mt19937&, boost::exponential_distribution<> > _ExponentialGenerator;
 
   71 typedef boost::variate_generator<boost::mt19937&, boost::geometric_distribution<boost::uniform_real<> > >
 
   73 typedef boost::variate_generator<boost::mt19937&, boost::normal_distribution<> > _NormalGenerator;
 
   74 typedef boost::variate_generator<boost::mt19937&, boost::lognormal_distribution<> > _LogNormalGenerator;
 
   89     virtual double next() = 0;
 
  134     _RealUniformGenerator uniGen;
 
  136     std::map<std::string, NumberGenerator*> generators;
 
  139     Random(boost::uint32_t seed);
 
  140     Random(boost::mt19937 generator);
 
  156     static void initialize(boost::mt19937 generator);
 
  282 ptrdiff_t uni_random(ptrdiff_t i);
 
  295 int countOf(I iteratorStart, I iteratorEnd){
 
  296   I iterator = iteratorStart;
 
  298   while(iterator != iteratorEnd){ iterator++; c++; }
 
  318 void shuffleList(std::vector<T*>& elementList){
 
  319   if(elementList.size() <= 1) 
return;
 
  322   for(
size_t i = 0, sz = elementList.size(); i < sz; i++){
 
  323     int other = rnd.
next();
 
  324     swap = elementList[i];
 
  325     elementList[i] = elementList[other];
 
  326     elementList[other] = swap;
 
  352 void shuffleSet(std::set<T*>& elementSet, std::vector<T*>& elementList){
 
  353   elementList.assign(elementSet.begin(), elementSet.end());
 
  354   shuffleList(elementList);
 
  412   std::vector<std::pair<int, I > > landmarks;
 
  423     interval((int)(sqrt((double)size))), maxLandmark(0), it(beginning), begin(beginning)  {
 
  424         landmarks.push_back(std::pair<int, I >(0, beginning));
 
  433     bool place = (index > (maxLandmark + interval));
 
  434     typename std::vector<std::pair<int, I > >::iterator lm = landmarks.end();
 
  435     while((--lm)->first > index);
 
  442         if(c % interval == 0){
 
  443           landmarks.push_back(std::pair<int, I >(c, it));
 
  492 template<
typename T, 
typename I>
 
  493 void selectNElementsAtRandom(I iterator, 
int size, 
unsigned int count, std::set<T*>&selectedElements, 
bool remove = 
false){
 
  516   int maxAlreadySelected = selectedElements.size();
 
  519   int knownSelectedElementsFromPop = 0;
 
  522   int minAvailable = size - maxAlreadySelected;
 
  526   if(count > minAvailable){
 
  527     if(maxAlreadySelected > 0){
 
  529       for(
int i = 0; i < size; i++){
 
  530         T* ptr = (&**tempIt);
 
  531         typename std::set<T*>::iterator found = selectedElements.find(ptr);
 
  532         if(found != selectedElements.end()) knownSelectedElementsFromPop++;
 
  535       maxAlreadySelected = knownSelectedElementsFromPop;
 
  536       minAvailable = size - maxAlreadySelected;
 
  540   typename std::vector<T*> tempToRemove;
 
  542     tempToRemove.assign(selectedElements.begin(), selectedElements.end());
 
  546   if(count > minAvailable){
 
  548     for(
int i = 0; i < size; i++){
 
  549       selectedElements.insert(&**it);
 
  554     RandomAccess<I> ra(iterator, size);
 
  561     if(count <= ((
double)minAvailable)*0.6){ 
 
  562       for (
unsigned int i = 0; i < count; i++)
 
  563                 do {  ptr = &**ra.get(rnd.next()); } 
while(!(selectedElements.insert(ptr).second));
 
  566       std::set<T*> elementsThatWillNotBeAdded;
 
  568       if(selectedElements.size() > 0){
 
  569         if(selectedElements.size() == knownSelectedElementsFromPop){ 
 
  570           elementsThatWillNotBeAdded.insert(selectedElements.begin(), selectedElements.end());
 
  574           for(
int i = 0; i < size; i++){
 
  576             if(selectedElements.find(ptr) != selectedElements.end()) elementsThatWillNotBeAdded.insert(ptr);
 
  582       while((size - elementsThatWillNotBeAdded.size()) > count) elementsThatWillNotBeAdded.insert(&**ra.get(rnd.next()));
 
  587       typename std::set<T*>::iterator notFound = elementsThatWillNotBeAdded.end();
 
  588       for(
int i = 0; i < size; i++){
 
  590         if(elementsThatWillNotBeAdded.find(ptr) == notFound) selectedElements.insert(ptr);
 
  597     typename std::vector<T*>::iterator toRemove = tempToRemove.begin();
 
  598     while(toRemove != tempToRemove.end()){
 
  599       selectedElements.erase(*toRemove);
 
  628 template<
typename T, 
typename I>
 
  629 void selectNElementsAtRandom(I iteratorStart, I iteratorEnd, 
int count, std::set<T*>&selectedElements, 
bool remove = 
false){
 
  630   selectNElementsAtRandom(iteratorStart, countOf(iteratorStart, iteratorEnd), count, selectedElements, remove);
 
  662 template<
typename T, 
typename I>
 
  663 void selectNElementsInRandomOrder(I iterator, 
int size, 
int count, std::vector<T*>& selectedElements, 
bool remove = 
false){
 
  665   std::set<T*> selectedElementSet;
 
  666   selectedElementSet.insert(selectedElements.begin(), selectedElements.end());
 
  667   selectedElements.clear();
 
  668   selectNElementsAtRandom(iterator, size, count, selectedElementSet, remove);
 
  669   shuffleSet(selectedElementSet, selectedElements);
 
  701 template<
typename T, 
typename I>
 
  702 void selectNElementsInRandomOrder(I iteratorStart, I iteratorEnd, 
int count, std::vector<T*>& selectedElements, 
bool remove = 
false){
 
  703   selectNElementsInRandomOrder(iteratorStart, countOf(iteratorStart, iteratorEnd), count, selectedElements, remove);