Add guf_rand_splitmix32

This commit is contained in:
jun 2025-03-28 22:09:15 +01:00
parent 461006746e
commit 05f995e855

View File

@ -27,6 +27,7 @@
#endif #endif
GUF_RAND_KWRDS uint64_t guf_rand_splitmix64(uint64_t *state); 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_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) 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" #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) cf. https://prng.di.unimi.it/splitmix64.c (last-retrieved 2025-02-11)
*/ */
GUF_RAND_KWRDS uint64_t guf_rand_splitmix64(uint64_t *state) 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); return z ^ (z >> 31);
} }
/*
splitmix32 written in 2016 by Kaito Udagawa (released under CC0 <http://creativecommons.org/publicdomain/zero/1.0/>)
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_RAND_KWRDS void guf_randstate_init(guf_randstate *state, uint64_t seed)
{ {
GUF_ASSERT_RELEASE(state); GUF_ASSERT_RELEASE(state);