use super::Rng;
#[derive(Debug, Clone)]
pub struct Xorshift32 {
state: u32,
}
impl Xorshift32 {
pub fn new(seed: u32) -> Self {
assert!(seed != 0, "Xorshift32 seed must be non-zero");
Self { state: seed }
}
}
impl Rng for Xorshift32 {
fn next_u32(&mut self) -> u32 {
let mut x = self.state;
x ^= x << 13;
x ^= x >> 17;
x ^= x << 5;
self.state = x;
x
}
}
#[derive(Debug, Clone)]
pub struct Xorshift64 {
state: u64,
}
impl Xorshift64 {
pub fn new(seed: u64) -> Self {
assert!(seed != 0, "Xorshift64 seed must be non-zero");
Self { state: seed }
}
}
impl Rng for Xorshift64 {
fn next_u32(&mut self) -> u32 {
let mut x = self.state;
x ^= x << 13;
x ^= x >> 7;
x ^= x << 17;
self.state = x;
(x >> 32) as u32
}
fn next_u64(&mut self) -> u64 {
let mut x = self.state;
x ^= x << 13;
x ^= x >> 7;
x ^= x << 17;
self.state = x;
x
}
}