mirror of https://github.com/OpenTTD/OpenTTD
(svn r19652) -Fix: RandomRange() is used for bigger ranges in many cases, so generally extent it to handle 32 bits.
parent
cd20724d20
commit
184fa43df2
|
@ -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));
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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];
|
||||||
|
|
Loading…
Reference in New Issue