4 |
4 |
5 #include "../stdafx.h" |
5 #include "../stdafx.h" |
6 #include "random_func.hpp" |
6 #include "random_func.hpp" |
7 #include "bitmath_func.hpp" |
7 #include "bitmath_func.hpp" |
8 |
8 |
9 uint32 _random_seeds[2][2]; |
9 Randomizer _random, _interactive_random; |
10 |
10 |
11 uint32 InteractiveRandom() |
11 uint32 Randomizer::Next() |
12 { |
12 { |
13 const uint32 s = _random_seeds[1][0]; |
13 const uint32 s = this->state[0]; |
14 const uint32 t = _random_seeds[1][1]; |
14 const uint32 t = this->state[1]; |
15 |
15 |
16 _random_seeds[1][0] = s + ROR(t ^ 0x1234567F, 7) + 1; |
16 this->state[0] = s + ROR(t ^ 0x1234567F, 7) + 1; |
17 return _random_seeds[1][1] = ROR(s, 3) - 1; |
17 return this->state[1] = ROR(s, 3) - 1; |
18 } |
18 } |
19 |
19 |
20 uint InteractiveRandomRange(uint max) |
20 uint32 Randomizer::Next(uint16 max) |
21 { |
21 { |
22 return GB(InteractiveRandom(), 0, 16) * max >> 16; |
22 return GB(this->Next(), 0, 16) * max >> 16; |
|
23 } |
|
24 |
|
25 void Randomizer::SetSeed(uint32 seed) |
|
26 { |
|
27 this->state[0] = seed; |
|
28 this->state[1] = seed; |
23 } |
29 } |
24 |
30 |
25 #ifdef MERSENNE_TWISTER |
31 #ifdef MERSENNE_TWISTER |
26 // Source code for Mersenne Twister. |
32 // Source code for Mersenne Twister. |
27 // A Random number generator with much higher quality random numbers. |
33 // A Random number generator with much higher quality random numbers. |
117 } |
123 } |
118 |
124 |
119 #else /* MERSENNE_TWISTER */ |
125 #else /* MERSENNE_TWISTER */ |
120 void SetRandomSeed(uint32 seed) |
126 void SetRandomSeed(uint32 seed) |
121 { |
127 { |
122 _random_seeds[0][0] = seed; |
128 _random.SetSeed(seed); |
123 _random_seeds[0][1] = seed; |
129 _interactive_random.SetSeed(seed * 0x1234567); |
124 _random_seeds[1][0] = seed * 0x1234567; |
|
125 _random_seeds[1][1] = _random_seeds[1][0]; |
|
126 } |
130 } |
127 |
131 |
128 #ifdef RANDOM_DEBUG |
132 #ifdef RANDOM_DEBUG |
129 #include "../network/network_data.h" |
133 #include "../network/network_data.h" |
|
134 #include "../variables.h" /* _frame_counter */ |
|
135 #include "../player_func.h" |
|
136 |
130 uint32 DoRandom(int line, const char *file) |
137 uint32 DoRandom(int line, const char *file) |
131 { |
138 { |
132 if (_networking && (DEREF_CLIENT(0)->status != STATUS_INACTIVE || !_network_server)) |
139 if (_networking && (DEREF_CLIENT(0)->status != STATUS_INACTIVE || !_network_server)) { |
133 printf("Random [%d/%d] %s:%d\n",_frame_counter, (byte)_current_player, file, line); |
140 printf("Random [%d/%d] %s:%d\n",_frame_counter, (byte)_current_player, file, line); |
134 #else /* RANDOM_DEBUG */ |
141 } |
135 uint32 Random() |
142 |
136 { |
143 return _random.Next(); |
|
144 } |
137 #endif /* RANDOM_DEBUG */ |
145 #endif /* RANDOM_DEBUG */ |
138 const uint32 s = _random_seeds[0][0]; |
|
139 const uint32 t = _random_seeds[0][1]; |
|
140 |
|
141 _random_seeds[0][0] = s + ROR(t ^ 0x1234567F, 7) + 1; |
|
142 return _random_seeds[0][1] = ROR(s, 3) - 1; |
|
143 } |
|
144 #endif /* MERSENNE_TWISTER */ |
146 #endif /* MERSENNE_TWISTER */ |
145 |
147 |
146 #if defined(RANDOM_DEBUG) && !defined(MERSENNE_TWISTER) |
148 #if defined(RANDOM_DEBUG) && !defined(MERSENNE_TWISTER) |
147 uint DoRandomRange(uint max, int line, const char *file) |
149 uint DoRandomRange(uint max, int line, const char *file) |
148 { |
150 { |
149 return GB(DoRandom(line, file), 0, 16) * max >> 16; |
151 return GB(DoRandom(line, file), 0, 16) * max >> 16; |
150 } |
152 } |
151 #else /* RANDOM_DEBUG & !MERSENNE_TWISTER */ |
|
152 uint RandomRange(uint max) |
|
153 { |
|
154 return GB(Random(), 0, 16) * max >> 16; |
|
155 } |
|
156 #endif /* RANDOM_DEBUG & !MERSENNE_TWISTER */ |
153 #endif /* RANDOM_DEBUG & !MERSENNE_TWISTER */ |