const N: usize = 25;
const M: usize = 7;
const S: usize = 7;
const T: usize = 15;
const A: u32 = 0x8ebfd028;
const B: u32 = 0x2b5b2500;
const C: u32 = 0xdb8b0000;
pub struct State {
x: [u32; N],
k: usize,
initialized: bool,
}
impl State {
pub fn new() -> Self {
State {
x: [0; N],
k: 0,
initialized: false,
}
}
pub fn initialize_seed(&mut self, seed: u32) {
let mut seed = seed;
for i in 0..N {
self.x[i] = seed & 0xffffffff; seed = (seed.wrapping_mul(1313).wrapping_add(88897)) & 0xffffffff; }
self.k = N - 1; self.initialized = true;
}
fn iterate_tgfsr(&mut self) {
for i in 0..N - M {
self.x[i] = self.x[i + M] ^ (self.x[i] >> 1) ^ if self.x[i] & 1 != 0 { A } else { 0 };
}
for i in N - M..N {
self.x[i] =
self.x[i + M - N] ^ (self.x[i] >> 1) ^ if self.x[i] & 1 != 0 { A } else { 0 };
}
}
pub fn next(&mut self) -> u32 {
if !self.initialized {
self.initialize_seed(1); }
self.k += 1;
if self.k == N {
self.iterate_tgfsr();
self.k = 0;
}
let mut y = self.x[self.k] ^ ((self.x[self.k] << S) & B);
y ^= (y << T) & C;
y & 0xffffffff }
pub fn random(&mut self) -> i32 {
(self.next() & 0x7fffffff) as i32 }
}