#![allow(unsafe_code)] #![allow(unused)] #[derive(Debug)] pub(crate) struct Rand { state: u64, } impl Rand { pub(crate) const fn new(seed: u64) -> Self { Self { state: seed } } pub(crate) fn rand_u32(&mut self) -> u32 { // sPCG32 from https://www.pcg-random.org/paper.html // see also https://nullprogram.com/blog/2017/09/21/ const M: u64 = 0xbb2efcec3c39611d; const A: u64 = 0x7590ef39; let s = self.state.wrapping_mul(M).wrapping_add(A); self.state = s; let shift = 29 - (s >> 61); (s >> shift) as u32 } pub(crate) fn rand_u16(&mut self) -> u16 { let n = self.rand_u32(); (n ^ (n >> 16)) as u16 } pub(crate) fn rand_source_port(&mut self) -> u16 { loop { let res = self.rand_u16(); if res > 1024 { return res; } } } }