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}