/* 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);
}
}