#![forbid(unsafe_code)]
#![forbid(missing_docs)]
#![forbid(rustdoc::broken_intra_doc_links)]
#![allow(unused_parens)]
#![allow(non_snake_case)]
#![cfg_attr(not(test), no_std)]
pub struct MINSTD0 (i32);
pub struct MINSTD (i32);
pub const M: i32 = 2147483647;
pub const SEED: i32 = 1;
pub const MIN: i32 = 1;
pub const MAX: i32 = M - 1;
pub fn clamp_seed(seed: i32) -> i32 {
seed.abs().max(1).min(M-1)
}
pub fn validate_seed(seed: i32) -> bool {
if seed <= 0 || seed % M == 0 {
false
} else {
true
}
}
impl MINSTD {
pub const A: i32 = 48271;
pub fn new() -> Self {
Self(SEED)
}
pub fn seed(seed: i32) -> Self {
if !validate_seed(seed) {
panic!("Supplied seed value is invalid. Use correct value [1,M-1] or clamp_seed() it into valid range.");
} else {
Self(seed)
}
}
pub fn next(& mut self) -> i32 {
let next64: i64 = ( self.0 as i64 * Self::A as i64) % M as i64;
let next32: i32 = next64 as i32;
self.0 = next32;
next32
}
}
impl MINSTD0 {
pub const A:i32 = 16807;
pub fn new() -> Self {
Self(SEED)
}
pub fn seed(seed: i32) -> Self {
if !validate_seed(seed) {
panic!("Supplied seed value is invalid. Use correct value [1,M-1] or clamp_seed() it into valid range.");
} else {
Self(seed)
}
}
pub fn next(& mut self) -> i32 {
let next64: i64 = ( self.0 as i64 * Self::A as i64) % M as i64;
let next32: i32 = next64 as i32;
self.0 = next32;
next32
}
}
#[cfg(test)]
mod minstd_seq_test;
#[cfg(test)]
mod minstd0_seq_test;
#[cfg(test)]
#[path="validate_test.rs"]
mod validate;
#[cfg(test)]
#[path="clamp_test.rs"]
mod clamp;
#[cfg(test)]
#[path="period_test.rs"]
mod period;