1 #![allow(unsafe_code)] 2 #![allow(unused)] 3 4 #[derive(Debug)] 5 pub(crate) struct Rand { 6 state: u64, 7 } 8 9 impl Rand { new(seed: u64) -> Self10 pub(crate) const fn new(seed: u64) -> Self { 11 Self { state: seed } 12 } 13 rand_u32(&mut self) -> u3214 pub(crate) fn rand_u32(&mut self) -> u32 { 15 // sPCG32 from https://www.pcg-random.org/paper.html 16 // see also https://nullprogram.com/blog/2017/09/21/ 17 const M: u64 = 0xbb2efcec3c39611d; 18 const A: u64 = 0x7590ef39; 19 20 let s = self.state.wrapping_mul(M).wrapping_add(A); 21 self.state = s; 22 23 let shift = 29 - (s >> 61); 24 (s >> shift) as u32 25 } 26 rand_u16(&mut self) -> u1627 pub(crate) fn rand_u16(&mut self) -> u16 { 28 let n = self.rand_u32(); 29 (n ^ (n >> 16)) as u16 30 } 31 rand_source_port(&mut self) -> u1632 pub(crate) fn rand_source_port(&mut self) -> u16 { 33 loop { 34 let res = self.rand_u16(); 35 if res > 1024 { 36 return res; 37 } 38 } 39 } 40 } 41