diff options
Diffstat (limited to 'jni/feature_stab/db_vlvm/db_utilities_random.h')
-rw-r--r-- | jni/feature_stab/db_vlvm/db_utilities_random.h | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/jni/feature_stab/db_vlvm/db_utilities_random.h b/jni/feature_stab/db_vlvm/db_utilities_random.h new file mode 100644 index 000000000..ef24039c1 --- /dev/null +++ b/jni/feature_stab/db_vlvm/db_utilities_random.h @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id: db_utilities_random.h,v 1.1 2010/08/19 18:09:20 bsouthall Exp $ */ + +#ifndef DB_UTILITIES_RANDOM +#define DB_UTILITIES_RANDOM + +#include "db_utilities.h" + + + +/***************************************************************** +* Lean and mean begins here * +*****************************************************************/ +/*! + * \defgroup LMRandom (LM) Random numbers, random sampling + */ +/*\{*/ +/*! + Random Number generator. Initialize with non-zero +integer value r. A double between zero and one is +returned. +\param r seed +\return random double +*/ +inline double db_QuickRandomDouble(int &r) +{ + int c; + c=r/127773; + r=16807*(r-c*127773)-2836*c; + if(r<0) r+=2147483647; + return((1.0/((double)2147483647))*r); + //return (((double)rand())/(double)RAND_MAX); +} + +/*! +Random Number generator. Initialize with non-zero +integer value r. An int between and including 0 and max + \param r seed + \param max upped limit + \return random int +*/ +inline int db_RandomInt(int &r,int max) +{ + double dtemp; + int itemp; + dtemp=db_QuickRandomDouble(r)*(max+1); + itemp=(int) dtemp; + if(itemp<=0) return(0); + if(itemp>=max) return(max); + return(itemp); +} + +/*! + Generate a random sample indexing into [0..pool_size-1]. + \param s sample (out) pre-allocated array of size sample_size + \param sample_size size of sample + \param pool_size upper limit on item index + \param r_seed random number generator seed + */ +inline void db_RandomSample(int *s,int sample_size,int pool_size,int &r_seed) +{ + int temp,temp2,i,j; + + for(i=0;i<sample_size;i++) + { + temp=db_RandomInt(r_seed,pool_size-1-i); + + for(j=0;j<i;j++) + { + if(s[j]<=temp) temp++; + else + { + /*swap*/ + temp2=temp; + temp=s[j]; + s[j]=temp2; + } + } + s[i]=temp; + } +} +/*\}*/ +#endif /* DB_UTILITIES_RANDOM */ |