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 00039 namespace cvflann 00040 { 00041 00045 CV_EXPORTS void seed_random(unsigned int seed); 00046 00047 /* 00048 * Generates a random double value. 00049 */ 00050 CV_EXPORTS double rand_double(double high = 1.0, double low=0); 00051 00052 /* 00053 * Generates a random integer value. 00054 */ 00055 CV_EXPORTS int rand_int(int high = RAND_MAX, int low = 0); 00056 00057 00065 class CV_EXPORTS UniqueRandom 00066 { 00067 int* vals; 00068 int size; 00069 int counter; 00070 00071 public: 00078 UniqueRandom(int n) : vals(NULL) { 00079 init(n); 00080 } 00081 00082 ~UniqueRandom() 00083 { 00084 delete[] vals; 00085 } 00086 00093 void init(int n) 00094 { 00095 // create and initialize an array of size n 00096 if (vals == NULL || n!=size) { 00097 delete[] vals; 00098 size = n; 00099 vals = new int[size]; 00100 } 00101 for(int i=0;i<size;++i) { 00102 vals[i] = i; 00103 } 00104 00105 // shuffle the elements in the array 00106 // Fisher-Yates shuffle 00107 for (int i=size;i>0;--i) { 00108 // int rand = cast(int) (drand48() * n); 00109 int rnd = rand_int(i); 00110 assert(rnd >=0 && rnd < i); 00111 std::swap(vals[i-1], vals[rnd]); 00112 } 00113 00114 counter = 0; 00115 } 00116 00122 int next() { 00123 if (counter==size) { 00124 return -1; 00125 } else { 00126 return vals[counter++]; 00127 } 00128 } 00129 }; 00130 00131 } // namespace cvflann 00132 00133 #endif //_OPENCV_RANDOM_H_