Update xorshift

This commit is contained in:
Abdelrahman Said 2025-04-20 20:47:20 +01:00
parent 0d541f6ee8
commit 181c4b8614

View File

@ -1,5 +1,6 @@
#include "xorshift.h"
#include "../../common/aliases/aliases.h"
#include "../../common/platform/platform.h"
#include <assert.h>
#include <stdbool.h>
#include <stdlib.h>
@ -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