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
35integer value r. A double between zero and one is
36returned.
37\param r    seed
38\return random double
39*/
40inline 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/*!
51Random Number generator. Initialize with non-zero
52integer value r. An int between and including 0 and max
53 \param r    seed
54 \param max    upped limit
55 \return random int
56*/
57inline 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 */
75inline 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