Import fmit upstream version 0.97.6
[fmit.git] / libs / CppAddons / Random.h
1 // Copyright 2003 "Gilles Degottex"
2
3 // This file is part of "CppAddons"
4
5 // "CppAddons" is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU Lesser General Public License as published by
7 // the Free Software Foundation; either version 2.1 of the License, or
8 // (at your option) any later version.
9 // 
10 // "CppAddons" is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU Lesser General Public License for more details.
14 // 
15 // You should have received a copy of the GNU Lesser General Public License
16 // along with this program; if not, write to the Free Software
17 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
19
20 #ifndef _Random_h_
21 #define _Random_h_
22
23 #include <time.h>
24
25 class Random
26 {
27 private:
28         static const int A;
29         static const int M;
30         static const int Q;
31         static const int R;
32  
33         long m_seed;
34         double m_nextNextGaussian;
35         bool m_haveNextNextGaussian;
36
37 public:
38         Random(long seed=time(NULL));
39
40         void setSeed(long seed);
41
42         static Random s_random;
43
44 protected:
45         long next();
46
47 public:
48
49         int nextInt()
50         {
51                 return (int)next();
52         }
53
54         int nextInt(int max)
55         {
56                 return nextInt()%max;
57         }
58
59         int nextInt(int a, int b)
60         {
61                 return nextInt()%(b-a) + a;
62         }
63
64         long nextLong()
65         {
66                 return next();
67         }
68
69     bool nextBoolean()
70         {
71                 return next() % 2 == 0;
72         }
73
74         float nextFloat()
75         {
76                 return nextInt() / float(M);
77         }
78
79         double nextDouble()
80         {
81                 return nextInt() / double(M);
82         }
83
84         char nextLetter()
85         {
86                 return char(('z' - 'a' + 1) * nextDouble() + 'a');
87         }
88
89         char nextFigure()
90         {
91                 return char(('9' - '0' + 1) * nextDouble() + '0');
92         }
93
94         double nextGaussian();
95 };
96
97 #endif
98