ax-rnd 0.1.0

Axrnd is a fast, small random number generator (rnd) library and CLI tool written in Rust.
Documentation
#![cfg_attr(not(feature = "std"), no_std)]

pub mod rnd;
pub mod rnd_alphanumeric;
pub use rnd::Axrnd;

#[inline]
pub fn rnd(seed: u64) -> Axrnd {
    Axrnd::new(seed)
}

#[inline(always)]
pub fn fill_bytes(rnd: &mut Axrnd, out: &mut [u8]) {
    rnd::fill_bytes(rnd, out)
}

#[inline(always)]
pub fn fill_u64(rnd: &mut Axrnd, out: &mut [u64]) {
    rnd::fill_u64(rnd, out)
}

#[inline(always)]
pub fn fill_u32(rnd: &mut Axrnd, out: &mut [u32]) {
    rnd::fill_u32(rnd, out)
}

#[inline(always)]
pub fn random_u64(seed: u64) -> u64 {
    let mut rnd = Axrnd::new(seed);

    rnd.next_u64()
}

#[inline(always)]
pub fn random_u32(seed: u64) -> u32 {
    let mut rnd = Axrnd::new(seed);

    rnd.next_u32()
}

#[inline(always)]
pub fn random_bool(seed: u64) -> bool {
    let mut rnd = Axrnd::new(seed);

    rnd.next_bool()
}

#[inline(always)]
pub fn random_f64(seed: u64) -> f64 {
    let mut rnd = Axrnd::new(seed);

    rnd.next_f64()
}

#[inline(always)]
pub fn bounded_u64(seed: u64, upper: u64) -> u64 {
    assert!(upper > 0, "upper must be > 0");

    let mut rnd = Axrnd::new(seed);

    rnd.bounded_u64(upper)
}

#[inline(always)]
pub fn random_alphanumeric(seed: u64, len: usize) -> String {
    let mut rnd = Axrnd::new(seed);
    rnd.next_alphanumeric(len)
}

#[inline(always)]
pub fn alpha(seed: u64, len: usize) -> String {
    let mut rnd = Axrnd::new(seed);
    rnd.alpha(len)
}

#[inline(always)]
pub fn random_base64url(seed: u64, len: usize) -> String {
    let mut rnd = Axrnd::new(seed);
    rnd.next_base64url(len)
}

#[inline(always)]
pub fn token(seed: u64, len: usize) -> String {
    let mut rnd = Axrnd::new(seed);
    rnd.token(len)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn deterministic() {
        let mut a = rnd(123);
        let mut b = rnd(123);

        for _ in 0..1000 {
            assert_eq!(a.next_u64(), b.next_u64(),);
        }
    }

    #[test]
    fn fill_bytes_works() {
        let mut rnd = rnd(999);

        let mut buf = [0u8; 128];

        fill_bytes(&mut rnd, &mut buf);

        let mut zero = true;

        for b in buf {
            if b != 0 {
                zero = false;
                break;
            }
        }

        assert!(!zero);
    }

    #[test]
    fn split_is_different() {
        let mut a = rnd(42);

        let mut b = a.split();

        assert_ne!(a.next_u64(), b.next_u64(),);
    }

    #[test]
    fn bounded_range() {
        let mut rnd = rnd(123);

        for _ in 0..10000 {
            let v = rnd.bounded_u64(10);

            assert!(v < 10);
        }
    }
}