/* Based on corrpcg.c, written in 2018 by Sebastiano Vigna (vigna@acm.org) adapted for Xoshiro by Melissa O'Neill (oneill@acm.org) Generates two correlated sets of outputs using Xoshiro256** generators. See . */ #include #include #include #include #include #include static inline uint64_t rotl(const uint64_t x, int k) { return (x << k) | (x >> (64 - k)); } static inline uint64_t next(uint64_t s[4]) { const uint64_t result_starstar = rotl(s[1] * 5, 7) * 9; const uint64_t t = s[1] << 17; s[2] ^= s[0]; s[3] ^= s[1]; s[1] ^= s[2]; s[0] ^= s[3]; s[2] ^= t; s[3] = rotl(s[3], 45); return result_starstar; } int main(int argc, char* argv[]) { // Seed data fresh from /dev/random uint64_t xo1[4] = { 0x100eeaf0461d14bb, 0xc67ba3a655084ee9, 0xcd64d86f417ed16f, 0x125247c9fa0e6ed0 }; // More random-looking seed data uint64_t xo2[4] = { 0xe874f9b004b1beaf, 0x7ddf99501670f4ab, 0x4db1ee8a7057915e, 0xe11fec18143a962f }; for(;;) { uint64_t out = next(xo1); fwrite(&out, sizeof out, 1, stdout); //printf("%016llx\n", out); out = next(xo2); fwrite(&out, sizeof out, 1, stdout); //printf("%016llx\n", out); } }