/* Written in 2019 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.0, 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. 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 uint32 rotl(const uint32 x, int k) { return (x << k) | (x >> (32 - k)); } uint32 xoshiro128plusplus_next(void* _state){ xoshiro128_state* state=_state; const uint32 result = rotl(state->s[0] + state->s[3], 7) + state->s[0]; const uint32 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; }