pub const SEED: i64 = 0x_1234_abcd_330e;
pub const A: i64 = 25214903917;
pub const C: i64 = 11;
pub const M: i64 = 2i64.pow(48);
pub const PERIOD: i64 = M;
pub const MIN: i64 = 0;
pub const MAX: i64 = M - 1;
pub struct DRAND48(i64);
pub fn srand48(seed: i32) -> DRAND48 {
DRAND48::seed( ( (seed as i64) << 16 | 0x330e ) & 0xFFFF_FFFF_FFFF_i64 )
}
impl DRAND48 {
pub fn new() -> Self {
Self(SEED)
}
pub fn seed(seed: i64) -> Self {
if !validate_seed(seed) {
panic!("Invalid seed. Must be non negative and lower than 2^48.");
}
Self(seed & 0xFFFF_FFFF_FFFF_i64) }
pub fn next(&mut self) -> i64 {
self.0 = (A.wrapping_mul(self.0).wrapping_add(C)) & M-1;
self.0
}
pub fn frand48(&mut self) -> f32 {
let next_val = self.next();
let top_24_bits = next_val >> 24;
(top_24_bits as f32) / (1u32 << 24) as f32
}
pub fn drand48(&mut self) -> f64 {
let next_val = self.next();
(next_val as f64) / M as f64
}
pub fn lrand48(&mut self) -> i32 {
((self.next() >> 17) & 0x7FFF_FFFF_i64) as i32
}
pub fn mrand48(&mut self) -> i32 {
((self.next() >> 16) & 0xFFFF_FFFF_i64) as i32
}
}
pub fn validate_seed(seed_val: i64) -> bool {
if seed_val < 0 {
false
} else {
seed_val < M
}
}
pub fn clamp_seed(seed_val: i64) -> i64 {
seed_val.abs() % M
}
pub mod extract;
#[cfg(test)]
#[path = "const_test.rs"]
mod consts;
#[cfg(test)]
#[path = "mrand48_test.rs"]
mod mrand;
#[cfg(test)]
#[path = "lrand48_test.rs"]
mod lrand;
#[cfg(test)]
#[path = "drand48_test.rs"]
mod drand;
#[cfg(test)]
#[path = "validate_test.rs"]
mod validate;
#[cfg(test)]
#[path = "clamp_test.rs"]
mod clamp;