/* Based on corrpcg.c, written in 2018 by Sebastiano Vigna (vigna@acm.org) adapted for SplitMix by Melissa O'Neill (oneill@acm.org) Generates two "independent" streams using a SplitMix generator. See . */ #include #include #include #include #include #include struct s_state { uint64_t counter; uint64_t gamma; }; static inline uint64_t next(struct s_state* s) { uint64_t z = (s->counter += s->gamma); z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9; z = (z ^ (z >> 27)) * 0x94d049bb133111eb; return z ^ (z >> 31); } int main(int argc, char* argv[]) { // Seed data fresh from /dev/random struct s_state sm1 = { 0x0ad704951a71e258UL, 0x9e3779b97f4a7c15UL }; // More random-looking seed data struct s_state sm2 = { 0xc9a6ab10c4a38a66UL, 0xdf67d33dd518d407UL }; for(;;) { uint64_t out = next(&sm1); fwrite(&out, sizeof out, 1, stdout); // printf("%016llx\n", out); out = next(&sm2); fwrite(&out, sizeof out, 1, stdout); // printf("%016llx\n", out); } }