12345678910111213141516171819202122232425262728293031323334353637383940 |
- #![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;
- }
- }
- }
- }
|