Index: libcfa/src/bits/random.hfa
===================================================================
--- libcfa/src/bits/random.hfa	(revision a6bb5fc3cba1bc103e8945536925013a92da67a2)
+++ libcfa/src/bits/random.hfa	(revision 09965e57a9fb4b13e767fe042c1dfcb22883f5f8)
@@ -28,4 +28,5 @@
 	#define XOSHIRO256PP
 	//#define KISS_64
+    // #define SPLITMIX_64
 
 	// 32-bit generators
@@ -37,4 +38,5 @@
 	//#define XORSHIFT_13_7_17
 	#define XOSHIRO256PP
+    // #define SPLITMIX_64
 
 	// 32-bit generators
@@ -78,13 +80,18 @@
 #endif // XORSHIFT_6_21_7
 
-#ifdef SPLITMIX_32
-#define PRNG_NAME_32 splitmix
-#define PRNG_STATE_32_T uint32_t
-#endif // SPLITMIX32
-
 #ifdef XORSHIFT_12_25_27
 #define PRNG_NAME_64 xorshift_12_25_27
 #define PRNG_STATE_64_T uint64_t
 #endif // XORSHIFT_12_25_27
+
+#ifdef SPLITMIX_64
+#define PRNG_NAME_64 splitmix64
+#define PRNG_STATE_64_T uint64_t
+#endif // SPLITMIX32
+
+#ifdef SPLITMIX_32
+#define PRNG_NAME_32 splitmix32
+#define PRNG_STATE_32_T uint32_t
+#endif // SPLITMIX32
 
 #ifdef KISS_64
@@ -124,4 +131,23 @@
 #ifdef __cforall										// don't include in C code (invoke.h)
 
+// Splitmix64
+// https://rosettacode.org/wiki/Pseudo-random_numbers/Splitmix64
+// Splitmix64 is not recommended for demanding random number requirements,
+// but is often used to calculate initial states for other more complex
+// pseudo-random number generators.                              
+static inline uint64_t splitmix64( uint64_t & state ) {
+    state += 0x9e3779b97f4a7c15;             /* increment the state variable */
+    uint64_t z = state;                      /* copy the state to a working variable */
+    z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9;  /* xor the variable with the variable right bit shifted 30 then multiply by a constant */
+    z = (z ^ (z >> 27)) * 0x94d049bb133111eb;  /* xor the variable with the variable right bit shifted 27 then multiply by a constant */
+    return z ^ (z >> 31);                      /* return the variable xored with itself right bit shifted 31 */
+}
+
+static inline void splitmix64_set_seed( uint64_t & state , uint64_t seed ) {
+    state = seed;
+    splitmix64( state );								// prime
+} // splitmix32_set_seed
+
+
 // Splitmix32
 // https://github.com/bryc/code/blob/master/jshash/PRNGs.md#splitmix32
@@ -130,5 +156,4 @@
 // pseudo-random number generators.
 // SplitMix32 is a 32 bit variant of Splitmix64
-
 static inline uint32_t splitmix32( uint32_t & state ) {
     state += 0x9e3779b9;
@@ -169,9 +194,4 @@
 		return m2;
 	} // wyhash64
-
-	static inline void wyhash64_set_seed( uint64_t & state, uint64_t seed ) {
-		state = seed;
-		wyhash64( state );								// prime
-	} // wyhash64_set_seed
 #endif // __SIZEOF_INT128__
 
@@ -208,13 +228,11 @@
 
 static inline void xoshiro256pp_set_seed( xoshiro256pp_t & state, uint64_t seed ) {
-    uint64_t state;
-    wyhash64_set_seed( state, seed );
     // these are done explicitly in this order to attain repeatable seeding.
     // do not call splitmix32 directly in the state init since order of argument evaluation
     // may not be consistent leading to irreproducible seeding
-    uint64_t seed1 = wyhash64( state );
-    uint64_t seed2 = wyhash64( state );
-    uint64_t seed3 = wyhash64( state );
-    uint64_t seed4 = wyhash64( state );
+    uint64_t seed1 = splitmix64( seed );
+    uint64_t seed2 = splitmix64( seed );
+    uint64_t seed3 = splitmix64( seed );
+    uint64_t seed4 = splitmix64( seed );
 	state = (xoshiro256pp_t){ seed1, seed2, seed3, seed4 };
 	xoshiro256pp( state );								// prime
