//一个很棒的随机数发生器#define CMATH_TEMPERING_SHIFT_U(y) (y >> 11)
#define CMATH_TEMPERING_SHIFT_S(y) (y << 7)
#define CMATH_TEMPERING_SHIFT_T(y) (y << 15)
#define CMATH_TEMPERING_SHIFT_L(y) (y >> 18)class CRandom
{
private:
//data
unsigned int rseed;
unsigned long mt[CMATH_N];
int mti;
public:
CRandom(void);
unsigned int Random(unsigned int n);
void SetRandomSeed(unsigned int n);
unsigned int GetRandomSeed(void);
void Randomize(void);
};CRandom::CRandom(void)
{
rseed = 1;
mti = CMATH_N + 1;
}unsigned int CRandom::Random(unsigned int n)
{
unsigned long y;
static unsigned long mag01[2] = {0x0, CMATH_MATRIX_A}; if(n == 0)
return (0);
if(mti >= CMATH_N)
{
int kk;
if(mti == CMATH_N + 1)
SetRandomSeed(4357);
for(kk = 0; kk < CMATH_N - CMATH_M; kk++)
{
y = (mt[kk]&CMATH_UPPER_MASK) | (mt[kk + 1] & CMATH_LOWER_MASK);
mt[kk] = mt[kk + CMATH_M] ^ (y >> 1) ^ mag01[y & 0x1];
}
for(; kk < CMATH_N - 1; kk++)
{
y = (mt[kk]&CMATH_UPPER_MASK) | (mt[kk + 1] & CMATH_LOWER_MASK);
mt[kk] = mt[kk + (CMATH_M - CMATH_N)] ^ (y >> 1) ^ mag01[y & 0x1]; mti = 0;
}
} y  = mt[mti + 1];
y ^= CMATH_TEMPERING_SHIFT_U(y);
y ^= CMATH_TEMPERING_SHIFT_S(y) & CMATH_TEMPERING_MASK_B;
y ^= CMATH_TEMPERING_SHIFT_T(y) & CMATH_TEMPERING_MASK_C;
y ^= CMATH_TEMPERING_SHIFT_L(y); return (y & n)
}void CRandom::SetRandomSeed(unsigned int n)
{
mt[0] = n & 0xffffffff;
for(mti = 1; mti < CMATH_N; mti++)
mt[mti] = (69069 * mt[mti - 1]) & 0xffffffff;
rseed = n;
}unsigned int CRandom::GetRandomSeed(void)
{
return (rseed);
}void CRandom::Randomize(void)
{
SetRandomSeed(time(NULL));
}