pub mod rand {
use std::time::SystemTime;
const MODULUS: u128 = 2u128.pow(64);
const INCREMENT: u64 = 1442695040888963407;
const MULTIPLIER: u64 = 6364136223846793005;
pub struct LCG {
pub seed: u64,
value: u64,
modulus: u128,
increment: u64,
multiplier: u64,
}
impl LCG {
pub fn new() -> LCG {
let s = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs();
LCG {
seed: s,
value: s,
modulus: MODULUS,
increment: INCREMENT,
multiplier: MULTIPLIER,
}
}
pub fn from_seed(seed: u64) -> LCG {
LCG {
seed,
value: seed,
modulus: MODULUS,
increment: INCREMENT,
multiplier: MULTIPLIER,
}
}
pub fn from_parameters(seed: u64, modulus: u128, increment: u64, multiplier: u64) -> LCG {
LCG {
seed,
value: seed,
modulus,
increment,
multiplier
}
}
pub fn next(&mut self) -> u64 {
self.value = (
((self.multiplier as u128) * (self.value as u128) + self.increment as u128) % self.modulus
) as u64;
self.value
}
pub fn range(&mut self, start: u64, end: u64) -> u64 {
let _ = self.next();
(self.value % (end - start + 1)) + start
}
pub fn choose<'a, T>(&'a mut self, v: &'a [T]) -> &T {
return &v[
self.range(0, (v.len()-1) as u64) as usize
];
}
}
}