Index: libcfa/src/concurrency/invoke.h
===================================================================
--- libcfa/src/concurrency/invoke.h	(revision 639e4fc03a02dc79f5ba9c49c73a1e8b6ae95701)
+++ libcfa/src/concurrency/invoke.h	(revision 910e1d0125019ed312cb7ec9bfe6067bddcf8ab6)
@@ -10,6 +10,6 @@
 // Created On       : Tue Jan 17 12:27:26 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Jan  9 19:06:45 2022
-// Update Count     : 48
+// Last Modified On : Fri Nov 18 12:20:26 2022
+// Update Count     : 49
 //
 
@@ -222,5 +222,5 @@
 		struct processor * last_proc;
 
-		uint32_t random_state;							// fast random numbers
+		__uint128_t random_state;						// fast random numbers
 
 		#if defined( __CFA_WITH_VERIFY__ )
Index: libcfa/src/concurrency/kernel/startup.cfa
===================================================================
--- libcfa/src/concurrency/kernel/startup.cfa	(revision 639e4fc03a02dc79f5ba9c49c73a1e8b6ae95701)
+++ libcfa/src/concurrency/kernel/startup.cfa	(revision 910e1d0125019ed312cb7ec9bfe6067bddcf8ab6)
@@ -39,4 +39,5 @@
 #include "limits.hfa"
 #include "math.hfa"
+#include "bits/random.hfa"								// prng
 
 #define CFA_PROCESSOR_USE_MMAP 0
@@ -107,5 +108,6 @@
 extern void __wake_proc(processor *);
 extern int cfa_main_returned;							// from interpose.cfa
-uint32_t __global_random_prime = 4_294_967_291u, __global_random_mask = false;
+PRNG_ARG_T __global_random_prime = 4_294_967_291u;
+bool __global_random_mask = false;
 
 //-----------------------------------------------------------------------------
Index: libcfa/src/concurrency/thread.cfa
===================================================================
--- libcfa/src/concurrency/thread.cfa	(revision 639e4fc03a02dc79f5ba9c49c73a1e8b6ae95701)
+++ libcfa/src/concurrency/thread.cfa	(revision 910e1d0125019ed312cb7ec9bfe6067bddcf8ab6)
@@ -10,6 +10,6 @@
 // Created On       : Tue Jan 17 12:27:26 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Feb 12 15:24:18 2022
-// Update Count     : 66
+// Last Modified On : Sun Nov 20 17:17:50 2022
+// Update Count     : 80
 //
 
@@ -26,5 +26,6 @@
 #include "invoke.h"
 
-extern uint32_t __global_random_seed, __global_random_prime, __global_random_mask;
+extern PRNG_ARG_T __global_random_seed, __global_random_prime;
+extern bool __global_random_mask;
 
 #pragma GCC visibility push(default)
@@ -221,17 +222,16 @@
 
 //-----------------------------------------------------------------------------
-#define GENERATOR LCG
-
-void set_seed( uint32_t seed ) {
-	uint32_t & state = active_thread()->random_state;
+
+void set_seed( uint64_t seed ) {
+	PRNG_ARG_T & state = active_thread()->random_state;
 	state = __global_random_seed = seed;
-	GENERATOR( state );
+	(void)PRNG_NAME( state );							// prime PRNG
 	__global_random_prime = state;
 	__global_random_mask = true;
 } // set_seed
 
-uint32_t prng( void ) {									// [0,UINT_MAX]
-	uint32_t & state = active_thread()->random_state;
-	return GENERATOR( state );
+uint64_t prng( void ) {									// [0,UINT_MAX]
+	PRNG_ARG_T & state = active_thread()->random_state;
+	return PRNG_NAME( state );
 } // prng
 
Index: libcfa/src/concurrency/thread.hfa
===================================================================
--- libcfa/src/concurrency/thread.hfa	(revision 639e4fc03a02dc79f5ba9c49c73a1e8b6ae95701)
+++ libcfa/src/concurrency/thread.hfa	(revision 910e1d0125019ed312cb7ec9bfe6067bddcf8ab6)
@@ -10,6 +10,6 @@
 // Created On       : Tue Jan 17 12:27:26 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Feb 11 16:34:07 2022
-// Update Count     : 20
+// Last Modified On : Sat Nov 19 16:41:27 2022
+// Update Count     : 30
 //
 
@@ -23,4 +23,5 @@
 #include "monitor.hfa"
 #include "exception.hfa"
+#include "bits/random.hfa"
 
 //-----------------------------------------------------------------------------
@@ -142,11 +143,11 @@
 // prng
 static inline {
-	uint32_t prng( thread$ & th ) __attribute__(( warn_unused_result )) { return LCG( th.random_state ); } // [0,UINT_MAX]
-	uint32_t prng( thread$ & th, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( th ) % u; } // [0,u)
-	uint32_t prng( thread$ & th, uint32_t l, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( th, u - l + 1 ) + l; } // [l,u]
+	uint64_t prng( thread$ & th ) __attribute__(( warn_unused_result )) { return PRNG_NAME( th.random_state ); } // [0,UINT_MAX]
+	uint64_t prng( thread$ & th, uint64_t u ) __attribute__(( warn_unused_result )) { return prng( th ) % u; } // [0,u)
+	uint64_t prng( thread$ & th, uint64_t l, uint64_t u ) __attribute__(( warn_unused_result )) { return prng( th, u - l + 1 ) + l; } // [l,u]
 	forall( T & | is_thread(T) ) {
-		uint32_t prng( T & th ) __attribute__(( warn_unused_result )) { return prng( (thread &)th ); } // [0,UINT_MAX]
-		uint32_t prng( T & th, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( th ) % u; } // [0,u)
-		uint32_t prng( T & th, uint32_t l, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( th, u - l + 1 ) + l; } // [l,u]
+		uint64_t prng( T & th ) __attribute__(( warn_unused_result )) { return prng( (thread &)th ); } // [0,UINT_MAX]
+		uint64_t prng( T & th, uint64_t u ) __attribute__(( warn_unused_result )) { return prng( th ) % u; } // [0,u)
+		uint64_t prng( T & th, uint64_t l, uint64_t u ) __attribute__(( warn_unused_result )) { return prng( th, u - l + 1 ) + l; } // [l,u]
 	} // distribution
 } // distribution
