#[derive(Clone, Copy, Debug)]
pub(crate) struct Xorshift64(u64);
pub(crate) const SEED_OFFSET: u64 = 0x9E37_79B9_7F4A_7C15;
pub(crate) fn bisector_stream(seed: u64) -> Xorshift64 {
Xorshift64::from_state(seed.wrapping_add(1))
}
pub(crate) fn restart_seed(base_seed: u64, restart: usize) -> u64 {
let restart_stream = (restart as u64).wrapping_mul(7919).wrapping_add(42);
restart_stream ^ fmix64(base_seed)
}
fn fmix64(mut value: u64) -> u64 {
value ^= value >> 30;
value = value.wrapping_mul(0xbf58_476d_1ce4_e5b9);
value ^= value >> 27;
value = value.wrapping_mul(0x94d0_49bb_1331_11eb);
value ^ (value >> 31)
}
impl Xorshift64 {
pub(crate) fn from_state(state: u64) -> Self {
Xorshift64(state)
}
pub(crate) fn next_u64(&mut self) -> u64 {
self.0 ^= self.0 << 13;
self.0 ^= self.0 >> 7;
self.0 ^= self.0 << 17;
self.0
}
pub(crate) fn next_u32(&mut self) -> u32 {
self.next_u64() as u32
}
}
#[cfg(test)]
mod tests;