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);