Changeset - r8792:db826506a415
[Not reviewed]
master
0 2 0
skidd13 - 16 years ago 2008-03-31 16:07:50
skidd13@openttd.org
(svn r12516) -Revert r2583: Removed mersenne PRNG cause it is not used and won't be used in the future
2 files changed with 1 insertions and 103 deletions:
0 comments (0 inline, 0 general)
src/core/random_func.cpp
Show inline comments
 
@@ -28,101 +28,6 @@ void Randomizer::SetSeed(uint32 seed)
 
	this->state[1] = seed;
 
}
 

	
 
#ifdef MERSENNE_TWISTER
 
// Source code for Mersenne Twister.
 
// A Random number generator with much higher quality random numbers.
 

	
 
#define N              (624)                 // length of _mt_state vector
 
#define M              (397)                 // a period parameter
 
#define K              (0x9908B0DFU)         // a magic constant
 
#define hiBit(u)       ((u) & 0x80000000U)   // mask all but highest   bit of u
 
#define loBit(u)       ((u) & 0x00000001U)   // mask all but lowest    bit of u
 
#define loBits(u)      ((u) & 0x7FFFFFFFU)   // mask     the highest   bit of u
 
#define mixBits(u, v)  (hiBit(u)|loBits(v))  // move hi bit of u to hi bit of v
 

	
 
static uint32 _mt_state[N+1];     // _mt_state vector + 1 extra to not violate ANSI C
 
static uint32 *_mt_next;          // _mt_next random value is computed from here
 
static int    _mt_left = -1;      // can *_mt_next++ this many times before reloading
 

	
 
void SetRandomSeed(register uint32 seed)
 
{
 
	register uint32 *s = _mt_state;
 
	_mt_left = 0;
 

	
 
	seed |= 1U;
 
	seed &= 0xFFFFFFFFU;
 

	
 
	*s = seed;
 

	
 
	for (register uint i = N; i != 0; i--) {
 
		seed *= 69069U;
 
		*s++;
 
		*s = seed & 0xFFFFFFFFU;
 
	}
 
}
 

	
 
static uint32 ReloadRandom()
 
{
 
	if (_mt_left < -1) SetRandomSeed(4357U);
 

	
 
	_mt_left = N - 1;
 
	_mt_next = _mt_state + 1;
 

	
 
	register uint32 *p0 = _mt_state;
 
	register uint32 *p2 = _mt_state + 2;
 
	register uint32 *pM = _mt_state + M;
 

	
 
	register uint32 s0 = _mt_state[0];
 
	register uint32 s1 = _mt_state[1];
 

	
 
	register uint i = 0;
 

	
 
	for (i = (N - M + 1); i != 0; i--) {
 
		s0 = s1;
 
		s1 = *p2;
 
		*p0 = *pM ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U);
 
		*p0++;
 
		*p2++;
 
		*pM++;
 
	}
 

	
 
	pM = _mt_state;
 

	
 
	for (i = M; i != 0; i--) {
 
		s0 = s1;
 
		s1 = *p2;
 
		*p0 = *pM ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U);
 
		*p0++;
 
		*p2++;
 
		*pM++;
 
	}
 

	
 
	s1 = _mt_state[0];
 
	*p0 = *pM ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U);
 

	
 
	s1 ^= (s1 >> 11);
 
	s1 ^= (s1 <<  7) & 0x9D2C5680U;
 
	s1 ^= (s1 << 15) & 0xEFC60000U;
 
	s1 ^= (s1 >> 18);
 
	return s1;
 
}
 

	
 
uint32 Random()
 
{
 
	_mt_left--;
 
	if (_mt_left < 0) return ReloadRandom();
 

	
 
	uint32 y = *_mt_next;
 
	*_mt_next++;
 

	
 
	y ^= (y >> 11);
 
	y ^= (y <<  7) & 0x9D2C5680U;
 
	y ^= (y << 15) & 0xEFC60000U;
 
	y ^= (y >> 18);
 
	return y;
 
}
 

	
 
#else /* MERSENNE_TWISTER */
 
void SetRandomSeed(uint32 seed)
 
{
 
	_random.SetSeed(seed);
 
@@ -142,12 +47,9 @@ uint32 DoRandom(int line, const char *fi
 

	
 
	return _random.Next();
 
}
 
#endif /* RANDOM_DEBUG */
 
#endif /* MERSENNE_TWISTER */
 

	
 
#if defined(RANDOM_DEBUG) && !defined(MERSENNE_TWISTER)
 
uint DoRandomRange(uint max, int line, const char *file)
 
{
 
	return GB(DoRandom(line, file), 0, 16) * max >> 16;
 
}
 
#endif /* RANDOM_DEBUG & !MERSENNE_TWISTER */
 
#endif /* RANDOM_DEBUG */
src/core/random_func.hpp
Show inline comments
 
@@ -23,10 +23,6 @@
 
//#define RANDOM_DEBUG
 

	
 

	
 
// Enable this to produce higher quality random numbers.
 
// Doesn't work with network yet.
 
// #define MERSENNE_TWISTER
 

	
 
/**
 
 * Structure to encapsulate the pseudo random number generators.
 
 */
0 comments (0 inline, 0 general)