From 05f995e85545099339e8724b15bdbaf4e372cc0b Mon Sep 17 00:00:00 2001 From: jun <83899451+zeichensystem@users.noreply.github.com> Date: Fri, 28 Mar 2025 22:09:15 +0100 Subject: [PATCH] Add guf_rand_splitmix32 --- src/guf_rand.h | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/guf_rand.h b/src/guf_rand.h index 280d3d8..15771b9 100644 --- a/src/guf_rand.h +++ b/src/guf_rand.h @@ -27,6 +27,7 @@ #endif GUF_RAND_KWRDS uint64_t guf_rand_splitmix64(uint64_t *state); +GUF_RAND_KWRDS uint32_t guf_rand_splitmix32(uint32_t *state); GUF_RAND_KWRDS void guf_randstate_init(guf_randstate *state, uint64_t seed); GUF_RAND_KWRDS void guf_randstate_jump(guf_randstate *state); // Advance the state; equivalent to 2^128 calls to guf_rand_u64(state) @@ -65,7 +66,7 @@ GUF_RAND_KWRDS float guf_rand_normal_sample_one_f32(guf_randstate *state, float #include "guf_math.h" /* - splitmix64 (public domain) written in 2015 by Sebastiano Vigna (vigna@acm.org) + splitmix64 written in 2015 by Sebastiano Vigna (vigna@acm.org) (released as public domain) cf. https://prng.di.unimi.it/splitmix64.c (last-retrieved 2025-02-11) */ GUF_RAND_KWRDS uint64_t guf_rand_splitmix64(uint64_t *state) @@ -77,6 +78,20 @@ GUF_RAND_KWRDS uint64_t guf_rand_splitmix64(uint64_t *state) return z ^ (z >> 31); } +/* + splitmix32 written in 2016 by Kaito Udagawa (released under CC0 ) + cf. https://github.com/umireon/my-random-stuff/blob/master/xorshift/splitmix32.c (last-retrieved 2025-03-28) +*/ +GUF_RAND_KWRDS uint32_t guf_rand_splitmix32(uint32_t *state) +{ + GUF_ASSERT(state); + uint32_t z = (*state += 0x9e3779b9); + z = (z ^ (z >> 16)) * 0x85ebca6b; + z = (z ^ (z >> 13)) * 0xc2b2ae35; + return z ^ (z >> 16); +} + + GUF_RAND_KWRDS void guf_randstate_init(guf_randstate *state, uint64_t seed) { GUF_ASSERT_RELEASE(state);