Extract splitmix64 PRNG
Release / release (push) Successful in 4s

This commit is contained in:
Abdelrahman Said
2026-09-16 00:12:50 +01:00
parent 9226891bb9
commit f46c3ab38a
6 changed files with 129 additions and 85 deletions
+10 -85
View File
@@ -1,40 +1,29 @@
// vim:fileencoding=utf-8:foldmethod=marker
#include "xorshift.h"
#include "../splitmix64/splitmix64.h"
#include "../../common/aliases/aliases.h"
#include "../../common/assert/assert.h"
#include "../../common/platform/platform.h"
#include "../../common/misc/misc_utils.h"
#include <stdlib.h>
#include <time.h>
typedef struct SplitMix64State SplitMix64State;
struct SplitMix64State {
u64 seed;
};
wp_intern u64 splitMix64(SplitMix64State *state);
wp_intern void seedOsGenerator(u64 seed);
wp_intern u64 genRandomNumber(void);
WpXor256State wpPrngXorshiftInit(void) {
return wpPrngXorshiftInitWithSeed(0);
}
WpXor256State wpPrngXorshiftInitWithSeed(u64 seed) {
wp_persist b8 seeded = false;
if (!seeded) {
seeded = true;
seedOsGenerator(seed);
WpSplitmix64State sm64;
if (seed > 0) {
sm64 = wpPrngSplitmix64InitWithSeed(seed);
} else {
sm64 = wpPrngSplitmix64Init();
}
SplitMix64State sm64 = {.seed = genRandomNumber()};
return (WpXor256State){
.x = splitMix64(&sm64),
.y = splitMix64(&sm64),
.z = splitMix64(&sm64),
.w = splitMix64(&sm64),
.x = wpPrngSplitmix64(&sm64),
.y = wpPrngSplitmix64(&sm64),
.z = wpPrngSplitmix64(&sm64),
.w = wpPrngSplitmix64(&sm64),
};
}
@@ -102,67 +91,3 @@ u64 wpPrngXorshift256ssChoice(WpXor256State *state, u64 available_choices) {
u64 wpPrngXorshift256pChoice(WpXor256State *state, u64 available_choices) {
return wpPrngXorshift256p(state) % available_choices;
}
wp_intern u64 splitMix64(SplitMix64State *state) {
state->seed += 0x9E3779B97f4A7C15;
u64 result = state->seed;
result = (result ^ (result >> 30)) * 0xBF58476D1CE4E5B9;
result = (result ^ (result >> 27)) * 0x94D049BB133111EB;
return result ^ (result >> 31);
}
#if defined(WP_PLATFORM_C) && WP_PLATFORM_C_VERSION >= WP_PLATFORM_C11_VERSION
#ifdef WP_PLATFORM_POSIX
wp_intern void seedOsGenerator(u64 seed) {
if (seed == 0) {
struct timespec ts = {0};
int result = clock_gettime(CLOCK_MONOTONIC_RAW, &ts);
wpRuntimeAssert(result == 0, "Invalid seed value");
seed = (u64)ts.tv_nsec;
}
srand48(seed);
}
wp_intern u64 genRandomNumber(void) {
return lrand48();
}
#else
wp_intern void seedOsGenerator(u64 seed) {
if (seed == 0) {
struct timespec ts = {0};
int result = timespec_get(&ts, TIME_UTC);
wpRuntimeAssert(result != 0, "Invalid seed value");
seed = (u64)ts.tv_nsec;
}
srand(seed);
}
wp_intern u64 genRandomNumber(void) {
i32 n1 = rand();
i32 n2 = rand();
return (((u64)n1) << 32 | (u64)n2);
}
#endif // !WP_PLATFORM_POSIX
#else
wp_intern void seedOsGenerator(u64 seed) {
if (seed == 0) {
time_t result = time(NULL);
wpRuntimeAssert(result != (time_t)(-1), "Invalid seed value");
seed = (u64)result;
}
srand(seed);
}
wp_intern u64 genRandomNumber(void) {
i32 n1 = rand();
i32 n2 = rand();
return (((u64)n1) << 32 | (u64)n2);
}
#endif // !WP_PLATFORM_C