Changeset - r15026:ba524394be83
[Not reviewed]
master
0 5 0
frosch - 14 years ago 2010-04-17 11:49:25
frosch@openttd.org
(svn r19652) -Fix: RandomRange() is used for bigger ranges in many cases, so generally extent it to handle 32 bits.
5 files changed with 16 insertions and 19 deletions:
0 comments (0 inline, 0 general)
bin/ai/regression/regression.nut
Show inline comments
 
@@ -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(9): " + AIBase.RandRange(9));
 
	print("  RandRange(9): " + AIBase.RandRange(9));
 
	print("  RandRange(9): " + AIBase.RandRange(9));
 
	print("  RandRange(1000000): " + AIBase.RandRange(1000000)); // 32 bit tests
 
	print("  RandRange(1000000): " + AIBase.RandRange(1000000));
 
	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));
bin/ai/regression/regression.txt
Show inline comments
 
@@ -96,10 +96,10 @@
 
  RandRange(1): 0
 
  RandRange(2): 0
 
  RandRange(2): 0
 
  RandRange(2): 1
 
  RandRange(9): 6
 
  RandRange(9): 7
 
  RandRange(9): 4
 
  RandRange(2): 0
 
  RandRange(1000000): 987346
 
  RandRange(1000000): 781750
 
  RandRange(1000000): 191841
 
  Chance(1, 2): true
 
  Chance(1, 2): false
 
  Chance(1, 2): false
src/core/random_func.cpp
Show inline comments
 
@@ -24,9 +24,9 @@ uint32 Randomizer::Next()
 
	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)
 
@@ -55,9 +55,8 @@ uint32 DoRandom(int line, const char *fi
 
	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 GB(DoRandom(line, file), 0, 16) * max >> 16;
 
	return ((uint64)DoRandom(line, file) * (uint64)max) >> 32;
 
}
 
#endif /* RANDOM_DEBUG */
src/core/random_func.hpp
Show inline comments
 
@@ -48,7 +48,7 @@ struct Randomizer {
 
	 * @param max the maximum value of the returned random number
 
	 * @return the random number
 
	 */
 
	uint32 Next(uint16 max);
 
	uint32 Next(uint32 max);
 

	
 
	/**
 
	 * (Re)set the state of the random number generator.
 
@@ -92,16 +92,15 @@ void SetRandomSeed(uint32 seed);
 
	#endif
 
	uint32 DoRandom(int line, const char *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
 
	static FORCEINLINE uint32 Random()
 
	{
 
		return _random.Next();
 
	}
 

	
 
	static FORCEINLINE uint32 RandomRange(uint max)
 
	static FORCEINLINE uint32 RandomRange(uint32 max)
 
	{
 
		assert(max <= UINT16_MAX);
 
		return _random.Next(max);
 
	}
 
#endif
 
@@ -111,7 +110,7 @@ static FORCEINLINE uint32 InteractiveRan
 
	return _interactive_random.Next();
 
}
 

	
 
static FORCEINLINE uint32 InteractiveRandomRange(uint16 max)
 
static FORCEINLINE uint32 InteractiveRandomRange(uint32 max)
 
{
 
	return _interactive_random.Next(max);
 
}
src/industry_cmd.cpp
Show inline comments
 
@@ -1923,8 +1923,7 @@ void GenerateIndustries()
 

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