random_lcg/prelude/
mod.rs

1/// Returns a random number between 0 and 1 with 2^31 different equal spaced values (32-bit float precision).
2/// 
3/// # Arguments
4/// 
5/// * `seed` - a mutable `u128` with a certain initial value (seed), that will be changing throughout calls.
6///
7/// # Example
8/// ```
9/// use random_lcg::prelude::*;
10/// 
11/// let mut seed = 12345u128;
12/// let mut val: f32;
13/// for _ in 0..10 {
14///     val = lcgf32(&mut seed);
15///     println!("Value Update: {}", val);
16///     println!("Seed Update: {}", seed);
17/// }
18/// ```
19pub fn lcgf32(seed: &mut u128) -> f32 {
20    // IBM C/C++ convention params
21    let a: u128 = 1103515245;
22    let b: u128 = 12345;
23    let m: u128 = 2u128.pow(31);
24
25    *seed = (a * *seed + b) % (m - 1);
26    
27    (*seed as f32) / (m as f32)
28
29}
30
31/// Returns a random number between 0 and 1 with 2^31 different equal spaced values (64-bit float precision).
32/// 
33/// # Arguments
34/// 
35/// * `seed` - a mutable `u128` with a certain initial value (seed), that will be changing throughout calls.
36///
37/// # Example
38/// ```
39/// use random_lcg::prelude::*;
40/// 
41/// let mut seed = 12345u128;
42/// let mut val: f64;
43/// for _ in 0..10 {
44///     val = lcgf64(&mut seed);
45///     println!("Value Update: {}", val);
46///     println!("Seed Update: {}", seed);
47/// }
48/// ```
49pub fn lcgf64(seed: &mut u128) -> f64 {
50    // IBM C/C++ convention params
51    let a: u128 = 1103515245;
52    let b: u128 = 12345;
53    let m: u128 = 2u128.pow(31);
54
55    *seed = (a * *seed + b) % (m - 1);
56    
57    (*seed as f64) / (m as f64)
58
59}
60
61/// Returns a random index (integer) between 0 and limit-1.
62/// 
63/// # Arguments
64/// 
65/// * `seed` - a mutable `u128` with a certain initial value (seed), that will be changing throughout calls.
66/// * `limit` - a `u128` representing the upper limit of the random index generation.
67/// 
68/// # Example
69/// ```
70/// use random_lcg::prelude::*;
71/// 
72/// let mut seed = 12345u128;
73/// let limit = 11;
74/// let mut val: usize;
75/// for _ in 0..10 {
76///     // integer value between 0 and 10 (inclusive)
77///     val = lcgf32(&mut seed, limit);
78///     println!("Value Update: {}", val);
79///     println!("Seed Update: {}", seed);
80/// }
81/// ```
82pub fn lcgi(seed: &mut u128, limit: u128) -> usize {
83    // IBM C/C++ convention params
84    let a: u128 = 1103515245;
85    let b: u128 = 12345;
86    let m: u128 = 2u128.pow(31);
87
88    *seed = (a * *seed + b) % (m - 1);
89    
90    ( *seed / ( (m-1) / limit ) ) as usize
91}