diff --git a/src/prng/xorshift/xorshift.c b/src/prng/xorshift/xorshift.c index 3c47d4e..46ebbd8 100644 --- a/src/prng/xorshift/xorshift.c +++ b/src/prng/xorshift/xorshift.c @@ -1,5 +1,6 @@ #include "xorshift.h" #include "../../common/aliases/aliases.h" +#include "../../common/platform/platform.h" #include #include #include @@ -12,19 +13,17 @@ struct split_mix_64_state { internal u64 rol64(u64 x, u64 bits); internal u64 split_mix_64(SplitMix64State *state); +internal void seed_os_generator(void); +internal u64 generate_random_number(void); XOR256State wapp_prng_xorshift_init_state(void) { persistent bool seeded = false; if (!seeded) { seeded = true; - - struct timespec ts = {0}; - clock_gettime(CLOCK_MONOTONIC_RAW, &ts); - - srand48(ts.tv_nsec); + seed_os_generator(); } - SplitMix64State sm64 = {.seed = lrand48()}; + SplitMix64State sm64 = {.seed = generate_random_number()}; return (XOR256State){ .x = split_mix_64(&sm64), @@ -88,3 +87,48 @@ internal u64 split_mix_64(SplitMix64State *state) { return result ^ (result >> 31); } + +#if defined(WAPP_PLATFORM_CPP) || (defined(WAPP_PLATFORM_C) && WAPP_PLATFORM_C_VERSION >= WAPP_PLATFORM_C11_VERSION) +#ifdef WAPP_PLATFORM_POSIX +internal void seed_os_generator(void) { + struct timespec ts = {0}; + int result = clock_gettime(CLOCK_MONOTONIC_RAW, &ts); + assert(result == 0 && "Failed to get time"); + + srand48(ts.tv_nsec); +} + +internal u64 generate_random_number(void) { + return lrand48(); +} +#else +internal void seed_os_generator(void) { + struct timespec ts = {0}; + int result = timespec_get(&ts, TIME_UTC); + assert(result != 0 && "Failed to get time"); + + srand(ts.tv_nsec); +} + +internal u64 generate_random_number(void) { + i32 n1 = rand(); + i32 n2 = rand(); + + return (((u64)n1) << 32 | (u64)n2); +} +#endif // !WAPP_PLATFORM_POSIX +#else +internal void seed_os_generator(void) { + time_t result = time(NULL); + assert(result != (time_t)(-1) && "Failed to get time"); + + srand(result); +} + +internal u64 generate_random_number(void) { + i32 n1 = rand(); + i32 n2 = rand(); + + return (((u64)n1) << 32 | (u64)n2); +} +#endif // !WAPP_PLATFORM_CPP