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