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