/* Written in 2018 by David Blackman and Sebastiano Vigna (vigna@acm.org) To the extent possible under law, the author has dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. This software is distributed without any warranty. See . */ #include "xoshiro128.h" /* This is xoshiro128** 1.1, one of our 32-bit all-purpose, rock-solid generators. It has excellent speed, a state size (128 bits) that is large enough for mild parallelism, and it passes all tests we are aware of. Note that version 1.0 had mistakenly state->s[0] instead of state->s[1] as state word passed to the scrambler. For generating just single-precision (i.e., 32-bit) floating-point numbers, xoshiro128+ is even faster. The state must be seeded so that it is not everywhere zero. */ static inline u32 rotl(const u32 x, i32 k) { return (x << k) | (x >> (32 - k)); } u32 xoshiro128starstar_next(void* _state){ xoshiro128_state* state=_state; const u32 result = rotl(state->s[1] * 5, 7) * 9; const u32 t = state->s[1] << 9; state->s[2] ^= state->s[0]; state->s[3] ^= state->s[1]; state->s[1] ^= state->s[2]; state->s[0] ^= state->s[3]; state->s[2] ^= t; state->s[3] = rotl(state->s[3], 11); return result; }