… | |
… | |
131 | // this is actually an adaptor that provides different types |
131 | // this is actually an adaptor that provides different types |
132 | // of random numbers. |
132 | // of random numbers. |
133 | template<class generator> |
133 | template<class generator> |
134 | struct random_number_generator : generator |
134 | struct random_number_generator : generator |
135 | { |
135 | { |
|
|
136 | random_number_generator () |
|
|
137 | { |
|
|
138 | } |
|
|
139 | |
|
|
140 | random_number_generator (uint32_t seed) |
|
|
141 | { |
|
|
142 | this->seed (seed); |
|
|
143 | } |
|
|
144 | |
136 | // uniform distribution, [0 .. num - 1] |
145 | // uniform distribution, [0 .. num - 1] |
137 | uint32_t operator ()(uint32_t num) |
146 | uint32_t operator ()(uint32_t num) |
138 | { |
147 | { |
139 | return !is_constant (num) ? get_range (num) // non-constant |
148 | return !is_constant (num) ? get_range (num) // non-constant |
140 | : num & (num - 1) ? (this->next () * (uint64_t)num) >> 32U // constant, non-power-of-two |
149 | : num & (num - 1) ? (this->next () * (uint64_t)num) >> 32U // constant, non-power-of-two |
… | |
… | |
164 | }; |
173 | }; |
165 | |
174 | |
166 | // the default rng used in the game |
175 | // the default rng used in the game |
167 | typedef random_number_generator<freeciv_random_generator> rand_gen; |
176 | typedef random_number_generator<freeciv_random_generator> rand_gen; |
168 | |
177 | |
|
|
178 | // used when we often seed |
|
|
179 | typedef random_number_generator<tausworthe_random_generator> seedable_rand_gen; |
|
|
180 | |
169 | extern rand_gen rndm, rmg_rndm; |
181 | extern rand_gen rndm, rmg_rndm; |
170 | |
182 | |
171 | #endif |
183 | #endif |
172 | |
184 | |