Загрузка данных


#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;
}