forked from pazdera/libcity
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrandom.cpp
131 lines (104 loc) · 2.13 KB
/
random.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/**
* This code is part of libcity library.
*
* @file random.cpp
* @date 23.03.2011
* @author Radek Pazdera ([email protected])
*
* @see random.h
*
*/
#include "random.h"
#include "debug.h"
#include <cstdlib>
#include <limits.h>
unsigned int Random::seed = libcity::RANDOM_SEED;
void Random::setSeed(int newSeed)
{
Random::seed = newSeed;
}
Random::Random()
: useOwnSeed(false), configuration(NONE)
{
state = seed;
}
Random::Random(double ownSeed)
: useOwnSeed(true), configuration(NONE)
{
state = ownSeed;
}
Random::~Random()
{}
double Random::generateDouble(double lower, double higher)
{
double temporary;
if (lower > higher)
{
temporary = lower;
lower = higher;
higher = temporary;
}
return base() * (higher - lower) + lower;
}
int Random::generateInteger(int lower, int higher)
{
int temporary;
if (lower > higher)
{
temporary = lower;
lower = higher;
higher = temporary;
}
return base() * (higher + 1 - lower) + lower;
}
bool Random::generateBool(double chance)
{
return generateDouble(0, 1) < chance;
}
double Random::base()
{
state = 1103515245*state + 12345;
if (!useOwnSeed)
{
seed = state;
}
return state / (static_cast<double>(UINT_MAX) + 1.0);
}
double Random::generate()
{
switch (configuration)
{
case NONE:
// FIXME exception
return 0;
case DOUBLE_VALUE:
return generateDouble(lowerBound, higherBound);
case INTEGER_VALUE:
return generateInteger(lowerBound, higherBound);
case BOOL_VALUE:
return generateBool(probability);
}
}
Random Random::doubleValue(double lower, double higher)
{
Random generator;
generator.configuration = DOUBLE_VALUE;
generator.lowerBound = lower;
generator.higherBound = higher;
return generator;
}
Random Random::integerValue(int lower, int higher)
{
Random generator;
generator.configuration = INTEGER_VALUE;
generator.lowerBound = lower;
generator.higherBound = higher;
return generator;
}
Random Random::boolValue(double chance)
{
Random generator;
generator.configuration = BOOL_VALUE;
generator.probability = chance;
return generator;
}