1
0
Fork 0

(svn r19652) -Fix: RandomRange() is used for bigger ranges in many cases, so generally extent it to handle 32 bits.

release/1.1
frosch 2010-04-17 11:49:25 +00:00
parent cd20724d20
commit 184fa43df2
5 changed files with 16 additions and 19 deletions

View File

@ -192,9 +192,9 @@ function Regression::Base()
print(" RandRange(2): " + AIBase.RandRange(2)); print(" RandRange(2): " + AIBase.RandRange(2));
print(" RandRange(2): " + AIBase.RandRange(2)); print(" RandRange(2): " + AIBase.RandRange(2));
print(" RandRange(2): " + AIBase.RandRange(2)); print(" RandRange(2): " + AIBase.RandRange(2));
print(" RandRange(9): " + AIBase.RandRange(9)); print(" RandRange(1000000): " + AIBase.RandRange(1000000)); // 32 bit tests
print(" RandRange(9): " + AIBase.RandRange(9)); print(" RandRange(1000000): " + AIBase.RandRange(1000000));
print(" RandRange(9): " + AIBase.RandRange(9)); print(" RandRange(1000000): " + AIBase.RandRange(1000000));
print(" Chance(1, 2): " + AIBase.Chance(1, 2)); print(" Chance(1, 2): " + AIBase.Chance(1, 2));
print(" Chance(1, 2): " + AIBase.Chance(1, 2)); print(" Chance(1, 2): " + AIBase.Chance(1, 2));
print(" Chance(1, 2): " + AIBase.Chance(1, 2)); print(" Chance(1, 2): " + AIBase.Chance(1, 2));

View File

@ -96,10 +96,10 @@
RandRange(1): 0 RandRange(1): 0
RandRange(2): 0 RandRange(2): 0
RandRange(2): 0 RandRange(2): 0
RandRange(2): 1 RandRange(2): 0
RandRange(9): 6 RandRange(1000000): 987346
RandRange(9): 7 RandRange(1000000): 781750
RandRange(9): 4 RandRange(1000000): 191841
Chance(1, 2): true Chance(1, 2): true
Chance(1, 2): false Chance(1, 2): false
Chance(1, 2): false Chance(1, 2): false

View File

@ -24,9 +24,9 @@ uint32 Randomizer::Next()
return this->state[1] = ROR(s, 3) - 1; return this->state[1] = ROR(s, 3) - 1;
} }
uint32 Randomizer::Next(uint16 max) uint32 Randomizer::Next(uint32 max)
{ {
return GB(this->Next(), 0, 16) * max >> 16; return ((uint64)this->Next() * (uint64)max) >> 32;
} }
void Randomizer::SetSeed(uint32 seed) void Randomizer::SetSeed(uint32 seed)
@ -55,9 +55,8 @@ uint32 DoRandom(int line, const char *file)
return _random.Next(); return _random.Next();
} }
uint DoRandomRange(uint max, int line, const char *file) uint32 DoRandomRange(uint32 max, int line, const char *file)
{ {
assert(max <= UINT16_MAX); return ((uint64)DoRandom(line, file) * (uint64)max) >> 32;
return GB(DoRandom(line, file), 0, 16) * max >> 16;
} }
#endif /* RANDOM_DEBUG */ #endif /* RANDOM_DEBUG */

View File

@ -48,7 +48,7 @@ struct Randomizer {
* @param max the maximum value of the returned random number * @param max the maximum value of the returned random number
* @return the random number * @return the random number
*/ */
uint32 Next(uint16 max); uint32 Next(uint32 max);
/** /**
* (Re)set the state of the random number generator. * (Re)set the state of the random number generator.
@ -92,16 +92,15 @@ void SetRandomSeed(uint32 seed);
#endif #endif
uint32 DoRandom(int line, const char *file); uint32 DoRandom(int line, const char *file);
#define RandomRange(max) DoRandomRange(max, __LINE__, __FILE__) #define RandomRange(max) DoRandomRange(max, __LINE__, __FILE__)
uint DoRandomRange(uint max, int line, const char *file); uint32 DoRandomRange(uint32 max, int line, const char *file);
#else #else
static FORCEINLINE uint32 Random() static FORCEINLINE uint32 Random()
{ {
return _random.Next(); return _random.Next();
} }
static FORCEINLINE uint32 RandomRange(uint max) static FORCEINLINE uint32 RandomRange(uint32 max)
{ {
assert(max <= UINT16_MAX);
return _random.Next(max); return _random.Next(max);
} }
#endif #endif
@ -111,7 +110,7 @@ static FORCEINLINE uint32 InteractiveRandom()
return _interactive_random.Next(); return _interactive_random.Next();
} }
static FORCEINLINE uint32 InteractiveRandomRange(uint16 max) static FORCEINLINE uint32 InteractiveRandomRange(uint32 max)
{ {
return _interactive_random.Next(max); return _interactive_random.Next(max);
} }

View File

@ -1923,8 +1923,7 @@ void GenerateIndustries()
/* Add the remaining industries according to their probabilities */ /* Add the remaining industries according to their probabilities */
for (uint i = 0; i < total_amount; i++) { for (uint i = 0; i < total_amount; i++) {
/* RandomRange() can only deal with 16 bit, which is not enough here. */ uint32 r = RandomRange(total_prob);
uint32 r = ((uint64)Random() * (uint64)total_prob) >> 32;
IndustryType it = 0; IndustryType it = 0;
while (it < NUM_INDUSTRYTYPES && r >= industry_probs[it]) { while (it < NUM_INDUSTRYTYPES && r >= industry_probs[it]) {
r -= industry_probs[it]; r -= industry_probs[it];