На языке программирования, который я использую (GML), все числа ограничены знаковыми int64 (или float64s). Как бы я реализовал этот XORshift128 + pRNG (в настоящее время закодированный в C) с такими ограничениями? Я бы также принял большее количество битов, если бы программирование было проще.
static uint32_t s[4] = { 0x8764000b, 0xf542d2d3, 0x6fa035c3, 0x77f2db5b };
static inline uint32_t rotl(const uint32_t x, int k) {
return (x << k) | (x >> (32 - k));
}
uint32_t next(void) {
const uint32_t result = s[0] + s[3];
const uint32_t t = s[1] << 9;
s[2] ^= s[0];
s[3] ^= s[1];
s[1] ^= s[2];
s[0] ^= s[3];
s[2] ^= t;
s[3] = rotl(s[3], 11);
return result;
}