Cinder

  • Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

include/opencv2/flann/random.h

Go to the documentation of this file.
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_