Skip to content

Commit 2436ac4

Browse files
authored
RNG (#77)
* quick first draft for random * update init method * nits * fix * rename * add source * fix --------- Co-authored-by: Luke Videckis <lukevideckis@gmail.com>
1 parent dd05502 commit 2436ac4

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

src/helpers/untested_rng.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
//! # Random Number Generator
2+
3+
/// see <https://en.wikipedia.org/wiki/Xorshift>
4+
///
5+
/// # Example
6+
/// ```
7+
/// use std::time::{SystemTime, UNIX_EPOCH};
8+
/// use programming_team_code_rust::helpers::untested_rng::UntestedRNG;
9+
///
10+
/// // fixed seed for debugging
11+
/// let mut rng1 = UntestedRNG::new(12345);
12+
/// // for submitting
13+
/// let mut rng2 = UntestedRNG::new(
14+
/// SystemTime::now()
15+
/// .duration_since(UNIX_EPOCH)
16+
/// .unwrap()
17+
/// .subsec_nanos() as u64,
18+
/// );
19+
///
20+
/// assert_eq!(rng1.get(), 13289605635609);
21+
/// assert_eq!(rng1.get_in_range(-3..4), 0);
22+
/// ```
23+
struct UntestedRNG {
24+
state: u64,
25+
}
26+
27+
impl UntestedRNG {
28+
/// Creates a new RNG
29+
///
30+
/// # Complexity
31+
/// - Time: O(1)
32+
/// - Space: O(1)
33+
fn new(seed: u64) -> Self {
34+
assert_ne!(seed, 0);
35+
Self { state: seed }
36+
}
37+
38+
/// Gets a new random number
39+
///
40+
/// # Complexity
41+
/// - Time: O(1)
42+
/// - Space: O(1)
43+
fn get(&mut self) -> u64 {
44+
let mut x = self.state;
45+
x ^= x << 13;
46+
x ^= x >> 7;
47+
x ^= x << 17;
48+
self.state = x;
49+
x
50+
}
51+
52+
/// Gets a new random number in range
53+
///
54+
/// # Complexity
55+
/// - Time: O(1)
56+
/// - Space: O(1)
57+
fn get_in_range(&mut self, range: std::ops::Range<i64>) -> i64 {
58+
range.start + (self.get() % (range.end - range.start) as u64) as i64
59+
}
60+
}

0 commit comments

Comments
 (0)