#include <stdint.h>
// Состояние генератора — два 64-битных слова
static uint64_t s[2];
// Циклический сдвиг влево
static inline uint64_t rotl(uint64_t x, int k) {
return (x << k) | (x >> (64 - k));
}
// Инициализация одним 64-битным seed при помощи SplitMix64
void seed_xoroshiro128plus(uint64_t seed) {
// SplitMix64 для получения двух начальных значений
uint64_t z = seed + 0x9e3779b97f4a7c15ULL;
z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9ULL;
z = (z ^ (z >> 27)) * 0x94d049bb133111ebULL;
s[0] = z ^ (z >> 31);
z = s[0] + 0x9e3779b97f4a7c15ULL;
z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9ULL;
z = (z ^ (z >> 27)) * 0x94d049bb133111ebULL;
s[1] = z ^ (z >> 31);
}
// Основная функция: возвращает 64-битное случайное число
static inline uint64_t next_random64(void) {
const uint64_t s0 = s[0];
uint64_t s1 = s[1];
const uint64_t result = s0 + s1; // «+» даёт хороший лавинный эффект
s1 ^= s0;
s[0] = rotl(s0, 24) ^ s1 ^ (s1 << 16); // a=24, b=16, c=37
s[1] = rotl(s1, 37);
return result;
}
// -------------------------------------------------
// Пример использования
#include <stdio.h>
#include <time.h>
int main(void) {
// Инициализация временем (для учебных целей)
seed_xoroshiro128plus((uint64_t)time(NULL));
for (int i = 0; i < 5; i++)
printf("%016llx\n", (unsigned long long)next_random64());
return 0;
}