1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /* $Id: db_utilities_random.h,v 1.1 2010/08/19 18:09:20 bsouthall Exp $ */
18 
19 #ifndef DB_UTILITIES_RANDOM
20 #define DB_UTILITIES_RANDOM
21 
22 #include "db_utilities.h"
23 
24 
25 
26 /*****************************************************************
27 *    Lean and mean begins here                                   *
28 *****************************************************************/
29 /*!
30  * \defgroup LMRandom (LM) Random numbers, random sampling
31  */
32 /*\{*/
33 /*!
34  Random Number generator. Initialize with non-zero
35 integer value r. A double between zero and one is
36 returned.
37 \param r    seed
38 \return random double
39 */
db_QuickRandomDouble(int & r)40 inline double db_QuickRandomDouble(int &r)
41 {
42     int c;
43     c=r/127773;
44     r=16807*(r-c*127773)-2836*c;
45     if(r<0) r+=2147483647;
46     return((1.0/((double)2147483647))*r);
47     //return (((double)rand())/(double)RAND_MAX);
48 }
49 
50 /*!
51 Random Number generator. Initialize with non-zero
52 integer value r. An int between and including 0 and max
53  \param r    seed
54  \param max    upped limit
55  \return random int
56 */
db_RandomInt(int & r,int max)57 inline int db_RandomInt(int &r,int max)
58 {
59     double dtemp;
60     int itemp;
61     dtemp=db_QuickRandomDouble(r)*(max+1);
62     itemp=(int) dtemp;
63     if(itemp<=0) return(0);
64     if(itemp>=max) return(max);
65     return(itemp);
66 }
67 
68 /*!
69  Generate a random sample indexing into [0..pool_size-1].
70  \param s            sample (out) pre-allocated array of size sample_size
71  \param sample_size    size of sample
72  \param pool_size    upper limit on item index
73  \param r_seed        random number generator seed
74  */
db_RandomSample(int * s,int sample_size,int pool_size,int & r_seed)75 inline void db_RandomSample(int *s,int sample_size,int pool_size,int &r_seed)
76 {
77     int temp,temp2,i,j;
78 
79     for(i=0;i<sample_size;i++)
80     {
81         temp=db_RandomInt(r_seed,pool_size-1-i);
82 
83         for(j=0;j<i;j++)
84         {
85             if(s[j]<=temp) temp++;
86             else
87             {
88                 /*swap*/
89                 temp2=temp;
90                 temp=s[j];
91                 s[j]=temp2;
92             }
93         }
94         s[i]=temp;
95     }
96 }
97 /*\}*/
98 #endif /* DB_UTILITIES_RANDOM */
99