minstd 0.9.4

MINSTD minimal standard random number generator
Documentation
/*
MINSTD Multiplicative congruential generator
implementation by Radim Kolar <hsn@sendmail.cz> 2024
https://gitlab.com/hsn10/minstd

This is free and unencumbered software released into the public domain.
SPDX-License-Identifier: Unlicense OR CC0-1.0

For more information, please refer to <http://unlicense.org/>
*/


/** alternatives */

   /** mcg */
   pub fn mcg16807(seed: &mut u32) -> i32 {
       let tmp: u64  = 16807u64 *  *seed as u64;
       *seed = ( tmp % 2147483647 ) as u32;
       *seed as i32
   }
   /** mcg */
   pub fn mcg_Schrage(seed: &mut u32) -> i32 {
       let mut ix:i32 = *seed as i32;
       let k1: i32 = ix / 127773;
       ix = 16807 * ( ix - k1 * 127773) - k1 * 2836;
       if ix < 0 {
          ix += 2147483647;
       }
       *seed = ix as u32;
       ix
   }
   /** doc */
   #[allow(non_upper_case_globals)]
   pub fn Park_Miller(seed: &mut u32) -> i32 {
     // (* Integer Version 2 *)
     const a: i32 = 16807;
     const m: i32 = 2147483647;
     const q: i32 = 127773; // (* m div a *)
     const r: i32 = 2836;   // (* m mod a *)

     let mut iseed = *seed as i32;

     let hi: i32 = iseed / q;
     let lo: i32 = iseed % q;
     let test: i32 = a * lo - r * hi;
     if test > 0 {
       iseed = test;
     } else {
       iseed = test + m;
     }
     *seed = iseed as u32;
     iseed 
   }
   /** doc */
   pub fn Whittle(seed: &mut u32) -> i32 {
    let hi:u32 = 16807 * (*seed >> 16);
    let mut lo:u32 = 16807 * (*seed & 0xFFFF);
    lo += (hi & 0x7FFF) << 16;
    lo += hi >> 15;
    if (lo > 2147483647) {
        lo -= 2147483647;
    }
    *seed = lo;
    lo as i32
   }