#include #include #include #include #include static u64 _sm64_next(u64& x) { u64 z = (x += 0x9e3779b97f4a7c15); z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9; z = (z ^ (z >> 27)) * 0x94d049bb133111eb; return z ^ (z >> 31); } namespace rng::seed { splitmix64::splitmix64(u64 u) : m_state(u){} u64 splitmix64::generate_seed() { return _sm64_next(m_state); } f64 splitmix64::generate_f64() { return generate_seed() / pow(2.0, 64); } u64 splitmix64::oneshot(u64& state) { return _sm64_next(state); } f64 splitmix64::oneshotf(u64& state) { return _sm64_next(state) / pow(2.0, 64); } splitmix64 splitmix64::random() { splitmix64 r (oneshot(time(NULL))); return r; } }