A tegnapi alter rnd szart se ért, itt egy ami jó, kipróbáltam több seeddel is, 8192 eset alatt sem produkált ismétlést.
rnd1.c:unsigned int __seed;
unsigned int rol(unsigned int value, unsigned char offset)
{
offset = offset & 0x1f;
return (value << offset) | (value >> (0x20 - offset));
}
unsigned int ror(unsigned int value, unsigned char offset)
{
offset = offset & 0x1f;
return (value >> offset) | (value << (0x20 - offset));
}
unsigned int rnd1()
{
unsigned int x, y, z, i;
x = __seed ^ 0xaaaaaaaa;
x = rol(x >> 11, x);
x = x ^ (x >> 21);
y = __seed ^ 0x55555555;
y = ror(y << 6, y);
y = y ^ (y >> 22);
z = (y << 16) | (x >> 16);
for (i = 0; i < 4; ++i)
{
x = rol(x, 5);
y = ror(y, 9);
__seed = rol(__seed, 11);
__seed ^= (x & 1 != 0 ? x : y);
__seed = (y & 0x80000001 != 0 ? ~__seed : __seed);
__seed = ror(__seed, 14);
__seed ^= z;
x ^= z;
y ^= z;
z = ror(z, __seed);
}
return __seed;
}
|