Commit 147f3ebf authored by Alexander Alekhin's avatar Alexander Alekhin

flann: use OpenCV theRNG()

std::rand() has no thread-safe guarantee.
parent 53e68546
...@@ -125,7 +125,12 @@ public: ...@@ -125,7 +125,12 @@ public:
/* Construct the randomized trees. */ /* Construct the randomized trees. */
for (int i = 0; i < trees_; i++) { for (int i = 0; i < trees_; i++) {
/* Randomize the order of vectors to allow for unbiased sampling. */ /* Randomize the order of vectors to allow for unbiased sampling. */
#ifndef OPENCV_FLANN_USE_STD_RAND
cv::randShuffle(vind_);
#else
std::random_shuffle(vind_.begin(), vind_.end()); std::random_shuffle(vind_.begin(), vind_.end());
#endif
tree_roots_[i] = divideTree(&vind_[0], int(size_) ); tree_roots_[i] = divideTree(&vind_[0], int(size_) );
} }
} }
......
...@@ -350,7 +350,11 @@ inline LshTable<unsigned char>::LshTable(unsigned int feature_size, unsigned int ...@@ -350,7 +350,11 @@ inline LshTable<unsigned char>::LshTable(unsigned int feature_size, unsigned int
// A bit brutal but fast to code // A bit brutal but fast to code
std::vector<size_t> indices(feature_size * CHAR_BIT); std::vector<size_t> indices(feature_size * CHAR_BIT);
for (size_t i = 0; i < feature_size * CHAR_BIT; ++i) indices[i] = i; for (size_t i = 0; i < feature_size * CHAR_BIT; ++i) indices[i] = i;
#ifndef OPENCV_FLANN_USE_STD_RAND
cv::randShuffle(indices);
#else
std::random_shuffle(indices.begin(), indices.end()); std::random_shuffle(indices.begin(), indices.end());
#endif
// Generate a random set of order of subsignature_size_ bits // Generate a random set of order of subsignature_size_ bits
for (unsigned int i = 0; i < key_size_; ++i) { for (unsigned int i = 0; i < key_size_; ++i) {
......
...@@ -40,13 +40,31 @@ ...@@ -40,13 +40,31 @@
namespace cvflann namespace cvflann
{ {
inline int rand()
{
#ifndef OPENCV_FLANN_USE_STD_RAND
# if INT_MAX == RAND_MAX
int v = cv::theRNG().next() & INT_MAX;
# else
int v = cv::theRNG().uniform(0, RAND_MAX + 1);
# endif
#else
int v = std::rand();
#endif // OPENCV_FLANN_USE_STD_RAND
return v;
}
/** /**
* Seeds the random number generator * Seeds the random number generator
* @param seed Random seed * @param seed Random seed
*/ */
inline void seed_random(unsigned int seed) inline void seed_random(unsigned int seed)
{ {
srand(seed); #ifndef OPENCV_FLANN_USE_STD_RAND
cv::theRNG() = cv::RNG(seed);
#else
std::srand(seed);
#endif
} }
/* /*
...@@ -60,7 +78,7 @@ inline void seed_random(unsigned int seed) ...@@ -60,7 +78,7 @@ inline void seed_random(unsigned int seed)
*/ */
inline double rand_double(double high = 1.0, double low = 0) inline double rand_double(double high = 1.0, double low = 0)
{ {
return low + ((high-low) * (std::rand() / (RAND_MAX + 1.0))); return low + ((high-low) * (rand() / (RAND_MAX + 1.0)));
} }
/** /**
...@@ -71,7 +89,7 @@ inline double rand_double(double high = 1.0, double low = 0) ...@@ -71,7 +89,7 @@ inline double rand_double(double high = 1.0, double low = 0)
*/ */
inline int rand_int(int high = RAND_MAX, int low = 0) inline int rand_int(int high = RAND_MAX, int low = 0)
{ {
return low + (int) ( double(high-low) * (std::rand() / (RAND_MAX + 1.0))); return low + (int) ( double(high-low) * (rand() / (RAND_MAX + 1.0)));
} }
/** /**
...@@ -107,7 +125,11 @@ public: ...@@ -107,7 +125,11 @@ public:
for (int i = 0; i < size_; ++i) vals_[i] = i; for (int i = 0; i < size_; ++i) vals_[i] = i;
// shuffle the elements in the array // shuffle the elements in the array
#ifndef OPENCV_FLANN_USE_STD_RAND
cv::randShuffle(vals_);
#else
std::random_shuffle(vals_.begin(), vals_.end()); std::random_shuffle(vals_.begin(), vals_.end());
#endif
counter_ = 0; counter_ = 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment