@@ -70,7 +70,7 @@ static ARG_COUNT: AtomicUsize = AtomicUsize::new(0);
7070static ARG_PTR : AtomicPtr < FfiString > = AtomicPtr :: new ( core:: ptr:: null_mut ( ) ) ;
7171
7272/// Random number generator state
73- static RAND_STATE : core:: sync:: atomic:: AtomicU16 = core:: sync:: atomic:: AtomicU16 :: new ( 0 ) ;
73+ static RAND_STATE : core:: sync:: atomic:: AtomicU32 = core:: sync:: atomic:: AtomicU32 :: new ( 0 ) ;
7474
7575// ============================================================================
7676// Types
@@ -459,17 +459,34 @@ pub fn wait_for_key() -> WaitForKey {
459459}
460460
461461/// Seed the 16-bit psuedorandom number generator
462- pub fn srand ( seed : u16 ) {
462+ pub fn srand ( seed : u32 ) {
463463 RAND_STATE . store ( seed, core:: sync:: atomic:: Ordering :: Relaxed ) ;
464464}
465465
466- /// Get a 16 -bit psuedorandom number
467- pub fn rand ( ) -> u16 {
466+ /// Get a 32 -bit psuedorandom number
467+ pub fn rand ( ) -> u32 {
468468 let mut state = RAND_STATE . load ( core:: sync:: atomic:: Ordering :: Relaxed ) ;
469- let bit = ( state ^ ( state >> 2 ) ^ ( state >> 3 ) ^ ( state >> 5 ) ) & 0x01 ;
470- state = ( state >> 1 ) | ( bit << 15 ) ;
469+ state = state. wrapping_mul ( 1103515245 ) . wrapping_add ( 12345 ) ;
470+ let bits1 = state >> 16 ;
471+ state = state. wrapping_mul ( 1103515245 ) . wrapping_add ( 12345 ) ;
472+ let bits2 = state >> 16 ;
471473 RAND_STATE . store ( state, core:: sync:: atomic:: Ordering :: Relaxed ) ;
472- state
474+ ( bits1 << 16 ) | bits2
475+ }
476+
477+ /// Get a random number from a range
478+ pub fn random_in ( range : core:: ops:: Range < u32 > ) -> u32 {
479+ let count = range. end - range. start ;
480+ let bucket_size = u32:: MAX / count;
481+ let limit = bucket_size * count;
482+ let rand_value = loop {
483+ let temp = rand ( ) as u32 ;
484+ if temp <= limit {
485+ break temp;
486+ }
487+ } ;
488+ let result = rand_value / bucket_size;
489+ result + range. start
473490}
474491
475492/// Get the API structure so we can call APIs manually.
0 commit comments