1 /***********************************************************************
2 * Software License Agreement (BSD License)
3 *
4 * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved.
5 * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved.
6 *
7 * THE BSD LICENSE
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 *
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *************************************************************************/
30
31 #ifndef OPENCV_FLANN_RANDOM_H
32 #define OPENCV_FLANN_RANDOM_H
33
34 #include <algorithm>
35 #include <cstdlib>
36 #include <vector>
37
38 #include "general.h"
39
40 namespace cvflann
41 {
42
43 /**
44 * Seeds the random number generator
45 * @param seed Random seed
46 */
seed_random(unsigned int seed)47 inline void seed_random(unsigned int seed)
48 {
49 srand(seed);
50 }
51
52 /*
53 * Generates a random double value.
54 */
55 /**
56 * Generates a random double value.
57 * @param high Upper limit
58 * @param low Lower limit
59 * @return Random double value
60 */
61 inline double rand_double(double high = 1.0, double low = 0)
62 {
63 return low + ((high-low) * (std::rand() / (RAND_MAX + 1.0)));
64 }
65
66 /**
67 * Generates a random integer value.
68 * @param high Upper limit
69 * @param low Lower limit
70 * @return Random integer value
71 */
72 inline int rand_int(int high = RAND_MAX, int low = 0)
73 {
74 return low + (int) ( double(high-low) * (std::rand() / (RAND_MAX + 1.0)));
75 }
76
77 /**
78 * Random number generator that returns a distinct number from
79 * the [0,n) interval each time.
80 */
81 class UniqueRandom
82 {
83 std::vector<int> vals_;
84 int size_;
85 int counter_;
86
87 public:
88 /**
89 * Constructor.
90 * @param n Size of the interval from which to generate
91 * @return
92 */
UniqueRandom(int n)93 UniqueRandom(int n)
94 {
95 init(n);
96 }
97
98 /**
99 * Initializes the number generator.
100 * @param n the size of the interval from which to generate random numbers.
101 */
init(int n)102 void init(int n)
103 {
104 // create and initialize an array of size n
105 vals_.resize(n);
106 size_ = n;
107 for (int i = 0; i < size_; ++i) vals_[i] = i;
108
109 // shuffle the elements in the array
110 std::random_shuffle(vals_.begin(), vals_.end());
111
112 counter_ = 0;
113 }
114
115 /**
116 * Return a distinct random integer in greater or equal to 0 and less
117 * than 'n' on each call. It should be called maximum 'n' times.
118 * Returns: a random integer
119 */
next()120 int next()
121 {
122 if (counter_ == size_) {
123 return -1;
124 }
125 else {
126 return vals_[counter_++];
127 }
128 }
129 };
130
131 }
132
133 #endif //OPENCV_FLANN_RANDOM_H
134