00001 /*********************************************************************** 00002 * Software License Agreement (BSD License) 00003 * 00004 * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. 00005 * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. 00006 * 00007 * THE BSD LICENSE 00008 * 00009 * Redistribution and use in source and binary forms, with or without 00010 * modification, are permitted provided that the following conditions 00011 * are met: 00012 * 00013 * 1. Redistributions of source code must retain the above copyright 00014 * notice, this list of conditions and the following disclaimer. 00015 * 2. Redistributions in binary form must reproduce the above copyright 00016 * notice, this list of conditions and the following disclaimer in the 00017 * documentation and/or other materials provided with the distribution. 00018 * 00019 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 00020 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 00021 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 00022 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 00023 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 00024 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 00025 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 00026 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 00028 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00029 *************************************************************************/ 00030 00031 #ifndef _OPENCV_RANDOM_H_ 00032 #define _OPENCV_RANDOM_H_ 00033 00034 #include <algorithm> 00035 #include <cstdlib> 00036 #include <cassert> 00037 00038 using namespace std; 00039 00040 namespace cvflann 00041 { 00042 00046 CV_EXPORTS void seed_random(unsigned int seed); 00047 00048 /* 00049 * Generates a random double value. 00050 */ 00051 CV_EXPORTS double rand_double(double high = 1.0, double low=0); 00052 00053 /* 00054 * Generates a random integer value. 00055 */ 00056 CV_EXPORTS int rand_int(int high = RAND_MAX, int low = 0); 00057 00058 00066 class CV_EXPORTS UniqueRandom 00067 { 00068 int* vals; 00069 int size; 00070 int counter; 00071 00072 public: 00079 UniqueRandom(int n) : vals(NULL) { 00080 init(n); 00081 } 00082 00083 ~UniqueRandom() 00084 { 00085 delete[] vals; 00086 } 00087 00094 void init(int n) 00095 { 00096 // create and initialize an array of size n 00097 if (vals == NULL || n!=size) { 00098 delete[] vals; 00099 size = n; 00100 vals = new int[size]; 00101 } 00102 for(int i=0;i<size;++i) { 00103 vals[i] = i; 00104 } 00105 00106 // shuffle the elements in the array 00107 // Fisher-Yates shuffle 00108 for (int i=size;i>0;--i) { 00109 // int rand = cast(int) (drand48() * n); 00110 int rnd = rand_int(i); 00111 assert(rnd >=0 && rnd < i); 00112 swap(vals[i-1], vals[rnd]); 00113 } 00114 00115 counter = 0; 00116 } 00117 00123 int next() { 00124 if (counter==size) { 00125 return -1; 00126 } else { 00127 return vals[counter++]; 00128 } 00129 } 00130 }; 00131 00132 } // namespace cvflann 00133 00134 #endif //_OPENCV_RANDOM_H_