//一个很棒的随机数发生器#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));
}
#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));
}
解决方案 »
- 最近使用delphi每次编译工程时都要先删除可执行文件的近来登记下,一起找原因。
- 小问题:怎分段取memo或richedit中数据
- MS-SQL Server 下栽的网址
- DBLookupListBox如何set
- 还是一个关于求学生名次的问题?路过的各位高手请帮忙看一看吧!数据库是access2000的
- 关于TWebBrowser
- 1)用过《MSN》或《网易泡泡》的人都知道
- 大虾们。什么是内存驻留程序。怎样让程序驻留内存?内存驻留有什么优点好缺点呢?
- 〓 我〓要〓给〓分〓!〓为〓什〓么〓给〓不〓了〓!〓CSDN〓在〓干〓什〓么 〓!〓
- 送分的SQL问题
- c++里的 unsigned char * 与 delphi 里什么类型匹配??
- BDE可否连接SQL2005(非ODBC)
其他的好像都好翻译的
Randomize();
Random();