RANDOM_TAIL randomTailGlobal;
void setRandomSeed (long _seed, RANDOM_TAIL *_rt) {
if (_seed) {
_rt->a = _rt->b = _seed;
} else {
_rt->a = _rt->b = (long)_rt + sys_hours + sys_minutes + sys_seconds + ~total_ticks; // pseudo random seed
if (_rt->a == 0)
_rt->a = 1;
}
}
void randomTailGlobal_startup () {
setRandomSeed (0, &randomTailGlobal);
}
void setRandomSeed (long _seed) {
setRandomSeed (_seed, &randomTailGlobal);
}
long getRandomLong (RANDOM_TAIL *_rt) {
_rt->a = 36969 * (_rt->a & 65535) + (_rt->a >> 16);
_rt->b = 18000 * (_rt->b & 65535) + (_rt->b >> 16);
return (_rt->a << 16) + _rt->b;
}
double getRandom (double _range, RANDOM_TAIL *_rt) {
double _d = getRandomLong ( _rt );
return ( _range * 0.5 ) + ( _d + 1.0 ) * _range * 2.328306435454494e-10;
}
double getRandom (double _range) {
return getRandom (_range, &randomTailGlobal);
}
double getRandom () {
return getRandom (1.0, &randomTailGlobal);
}
RANDOM_TAIL *randomTailCreate (long _seed) {
RANDOM_TAIL *_rt = sys_malloc (sizeof(RANDOM_TAIL));
setRandomSeed (_seed, _rt);
return _rt;
}
void randomTailRemove (RANDOM_TAIL *_rt) {
sys_free (_rt);
}