Diehard (http://stat.fsu.edu/~geo/diehard.html ) огрехов конечно не находит.
static struct
{
unsigned Head, Tail;
unsigned __int32 Pool[64];
} Random;
void LYSAP_RandomPushSalt(unsigned Salt)
{
Random.Pool[Random.Head] += Salt;
Random.Head = (Random.Head + 1) & 63;
}
void LYSAP_RandomInit(unsigned Seed)
{
Random.Tail = 0;
Random.Head = 0;
for(unsigned i = 0; i < 64; i++)
// можно заполнить нулями, но тогда первые
// 4096 сгенерированных чисел лучше пропустить
Random.Pool[i] = (Seed = 1664525ul * Seed + 1013904223ul);
}
unsigned LYSAP_GetRandom()
{
unsigned __int32 Value =
Random.Pool[Random.Tail] // X ** 1
^ Random.Pool[(Random.Tail + 1) & 63] // X ** 64
^ Random.Pool[(Random.Tail + 62) & 63] // X ** 4
^ Random.Pool[(Random.Tail + 61) & 63]; // X ** 3
unsigned __int32 Salt =
1 // may be any non-zero
+ ROT_L(Random.Pool[(Random.Tail + 11) & 63], 5)
+ ROT_L(Random.Pool[(Random.Tail + 23) & 63], 7)
+ ROT_L(Random.Pool[(Random.Tail + 37) & 63], 1);
Value += Salt; Value += Value < Salt; // cyclic addition with carry
Random.Pool[Random.Tail = (Random.Tail + 1) & 63] = Value;
return Value;
} ---
http://leo.yuriev.ru
|