#include <stdint.h>
typedef int8_t i8;
typedef int16_t i16;
typedef int32_t i32;
typedef int64_t i64;
typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
typedef uint64_t u64;
typedef float f32;
typedef double f64;
typedef struct {u32 s1, s2, s3;} taus88_t;
taus88_t make_taus88(u32 seed);
u32 taus88u32(taus88_t *t);
f32 taus88f32(taus88_t *t);
taus88_t make_taus88(u32 seed)
{
taus88_t t;
t.s1 = 1243598713U ^ seed; if (t.s1 < 2) t.s1 = 1243598713U;
t.s2 = 3093459404U ^ seed; if (t.s2 < 8) t.s2 = 3093459404U;
t.s3 = 1821928721U ^ seed; if (t.s3 < 16) t.s3 = 1821928721U;
return t;
}
u32 taus88u32(taus88_t *t)
{
t->s1 = ((t->s1 & -2) << 12) ^ (((t->s1 << 13) ^ t->s1) >> 19);
t->s2 = ((t->s2 & -8) << 4) ^ (((t->s2 << 2) ^ t->s2) >> 25);
t->s3 = ((t->s3 & -16) << 17) ^ (((t->s3 << 3) ^ t->s3) >> 11);
return t->s1 ^ t->s2 ^ t->s3;
}
f32 taus88f32(taus88_t *t)
{
union {u32 i ; f32 f ;} u;
u.i = 0x3F800000 | (taus88u32(t) >> 9);
return u.f - 1.0;
}
int main()
{
taus88_t* TAUS88 ;
*TAUS88 = make_taus88(6346456);
u32 numberu32 = taus88u32(TAUS88);
f32 numberf32 = taus88f32(TAUS88);
return 0;
}
I2luY2x1ZGUgPHN0ZGludC5oPgp0eXBlZGVmIGludDhfdCAgICBpODsKdHlwZWRlZiBpbnQxNl90ICAgaTE2Owp0eXBlZGVmIGludDMyX3QgICBpMzI7CnR5cGVkZWYgaW50NjRfdCAgIGk2NDsKCnR5cGVkZWYgdWludDhfdCAgIHU4Owp0eXBlZGVmIHVpbnQxNl90ICB1MTY7CnR5cGVkZWYgdWludDMyX3QgIHUzMjsKdHlwZWRlZiB1aW50NjRfdCAgdTY0Owp0eXBlZGVmIGZsb2F0ICBmMzI7CnR5cGVkZWYgZG91YmxlIGY2NDsKCnR5cGVkZWYgc3RydWN0IHt1MzIgczEsIHMyLCBzMzt9IHRhdXM4OF90OwoKdGF1czg4X3QgbWFrZV90YXVzODgodTMyIHNlZWQpOwp1MzIgdGF1czg4dTMyKHRhdXM4OF90ICp0KTsKZjMyIHRhdXM4OGYzMih0YXVzODhfdCAqdCk7Cgp0YXVzODhfdCBtYWtlX3RhdXM4OCh1MzIgc2VlZCkKewogIHRhdXM4OF90IHQ7CiAgdC5zMSA9IDEyNDM1OTg3MTNVIF4gc2VlZDsgaWYgKHQuczEgPCAgMikgdC5zMSA9IDEyNDM1OTg3MTNVOwogIHQuczIgPSAzMDkzNDU5NDA0VSBeIHNlZWQ7IGlmICh0LnMyIDwgIDgpIHQuczIgPSAzMDkzNDU5NDA0VTsKICB0LnMzID0gMTgyMTkyODcyMVUgXiBzZWVkOyBpZiAodC5zMyA8IDE2KSB0LnMzID0gMTgyMTkyODcyMVU7CiAgcmV0dXJuIHQ7Cn0KCnUzMiB0YXVzODh1MzIodGF1czg4X3QgKnQpCnsKICB0LT5zMSA9ICgodC0+czEgJiAgLTIpIDw8IDEyKSBeICgoKHQtPnMxIDw8IDEzKSBeICB0LT5zMSkgPj4gMTkpOwogIHQtPnMyID0gKCh0LT5zMiAmICAtOCkgPDwgIDQpIF4gKCgodC0+czIgPDwgIDIpIF4gIHQtPnMyKSA+PiAyNSk7CiAgdC0+czMgPSAoKHQtPnMzICYgLTE2KSA8PCAxNykgXiAoKCh0LT5zMyA8PCAgMykgXiAgdC0+czMpID4+IDExKTsKICByZXR1cm4gdC0+czEgXiB0LT5zMiBeIHQtPnMzOwp9CgpmMzIgdGF1czg4ZjMyKHRhdXM4OF90ICp0KQp7CiAgdW5pb24ge3UzMiBpIDsgZjMyIGYgO30gdTsKICB1LmkgPSAweDNGODAwMDAwIHwgKHRhdXM4OHUzMih0KSA+PiA5KTsKICByZXR1cm4gdS5mIC0gMS4wOwp9CgppbnQgbWFpbigpCnsKCiAgICB0YXVzODhfdCogVEFVUzg4IDsKICAgIAogICAgKlRBVVM4OCA9IG1ha2VfdGF1czg4KDYzNDY0NTYpOwogICAgdTMyIG51bWJlcnUzMiA9IHRhdXM4OHUzMihUQVVTODgpOwogICAgZjMyIG51bWJlcmYzMiA9IHRhdXM4OGYzMihUQVVTODgpOwoKICAgIHJldHVybiAwOwp9