1#[derive(Debug, Clone)]
10pub struct Rng {
11 state: u64,
12}
13
14impl Rng {
15 pub fn seeded(seed: u64) -> Self {
17 Self { state: seed }
18 }
19
20 #[inline]
22 pub fn next_u64(&mut self) -> u64 {
23 self.state = self.state.wrapping_add(0x9e3779b97f4a7c15);
24 let mut z = self.state;
25 z = (z ^ (z >> 30)).wrapping_mul(0xbf58476d1ce4e5b9);
26 z = (z ^ (z >> 27)).wrapping_mul(0x94d049bb133111eb);
27 z ^ (z >> 31)
28 }
29
30 #[inline]
32 pub fn next_f64(&mut self) -> f64 {
33 (self.next_u64() >> 11) as f64 / (1u64 << 53) as f64
34 }
35
36 pub fn next_normal(&mut self) -> f64 {
38 let u1 = self.next_f64().max(f64::MIN_POSITIVE); let u2 = self.next_f64();
40 (-2.0 * u1.ln()).sqrt() * (2.0 * std::f64::consts::PI * u2).cos()
41 }
42
43 pub fn fork(&mut self) -> Rng {
45 Rng::seeded(self.next_u64())
46 }
47}
48
49#[cfg(test)]
50mod tests {
51 use super::*;
52
53 #[test]
54 fn test_determinism() {
55 let mut a = Rng::seeded(42);
56 let mut b = Rng::seeded(42);
57 for _ in 0..100 {
58 assert_eq!(a.next_u64(), b.next_u64());
59 }
60 }
61
62 #[test]
63 fn test_f64_range() {
64 let mut rng = Rng::seeded(123);
65 for _ in 0..1000 {
66 let v = rng.next_f64();
67 assert!(v >= 0.0 && v < 1.0);
68 }
69 }
70
71 #[test]
72 fn test_fork_independence() {
73 let mut rng = Rng::seeded(42);
74 let mut child = rng.fork();
75 assert_ne!(rng.next_u64(), child.next_u64());
77 }
78}