mirror of
https://github.com/opencv/opencv.git
synced 2025-08-05 14:06:35 +08:00
flann: use OpenCV theRNG()
std::rand() has no thread-safe guarantee.
This commit is contained in:
parent
53e685461e
commit
147f3ebf0a
@ -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
|
|||||||
// 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 @@
|
|||||||
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)
|
|||||||
*/
|
*/
|
||||||
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)
|
|||||||
*/
|
*/
|
||||||
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:
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user