Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef RTABMAP_FLANN_RANDOM_H
00032 #define RTABMAP_FLANN_RANDOM_H
00033
00034 #include <algorithm>
00035 #include <cstdlib>
00036 #include <cstddef>
00037 #include <vector>
00038
00039 #include "rtflann/general.h"
00040
00041 namespace rtflann
00042 {
00043
00048 inline void seed_random(unsigned int seed)
00049 {
00050 srand(seed);
00051 }
00052
00053
00054
00055
00062 inline double rand_double(double high = 1.0, double low = 0)
00063 {
00064 return low + ((high-low) * (std::rand() / (RAND_MAX + 1.0)));
00065 }
00066
00073 inline int rand_int(int high = RAND_MAX, int low = 0)
00074 {
00075 return low + (int) ( double(high-low) * (std::rand() / (RAND_MAX + 1.0)));
00076 }
00077
00078
00079 class RandomGenerator
00080 {
00081 public:
00082 ptrdiff_t operator() (ptrdiff_t i) { return rand_int(i); }
00083 };
00084
00085
00090 class UniqueRandom
00091 {
00092 std::vector<int> vals_;
00093 int size_;
00094 int counter_;
00095
00096 public:
00102 UniqueRandom(int n)
00103 {
00104 init(n);
00105 }
00106
00111 void init(int n)
00112 {
00113 static RandomGenerator generator;
00114
00115 vals_.resize(n);
00116 size_ = n;
00117 for (int i = 0; i < size_; ++i) vals_[i] = i;
00118
00119
00120 std::random_shuffle(vals_.begin(), vals_.end(), generator);
00121
00122 counter_ = 0;
00123 }
00124
00130 int next()
00131 {
00132 if (counter_ == size_) {
00133 return -1;
00134 }
00135 else {
00136 return vals_[counter_++];
00137 }
00138 }
00139 };
00140
00141 }
00142
00143 #endif //FLANN_RANDOM_H
00144
00145