#ifndef XOROACC32_H #define XOROACC32_H #include #include "splitmix64.h" #define xoroacc32_size 3 // state for xoroacc32 static uint16_t xoroacc32_s[xoroacc32_size]; static inline uint16_t rotl16(const uint16_t x, int k) { return (x << k) | (x >> (16 - k)); } static inline void xoroacc32_seed(uint16_t seed) { for (int k = 0; k < xoroacc32_size; k++) xoroacc32_s[k] = splitmix64_stateless(seed + k); } static inline uint16_t xoroshiro32pp(void) { uint16_t s0 = xoroacc32_s[0]; uint16_t s1 = xoroacc32_s[1]; uint16_t result = rotl16(s0 + s1, 9) + s0; s1 = s1 ^ s0; xoroacc32_s[0] = rotl16(s0, 13) ^ s1 ^ (s1 << 5); xoroacc32_s[1] = rotl16(s1, 10); return result; } // returns random number, modifies xoroacc32_s static inline uint32_t xoroacc32(void) { xoroacc32_s[2] = xoroacc32_s[2] + (xoroshiro32pp() + 1); uint32_t result = (uint32_t)xoroacc32_s[2]; xoroacc32_s[2] = xoroacc32_s[2] + xoroshiro32pp(); result = result | ((uint32_t)xoroacc32_s[2] << 16); return result; } #endif // XOROACC32_H