Update xorshift
This commit is contained in:
parent
0d541f6ee8
commit
181c4b8614
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user