urng 0.9.0

Universal Random Number Generator
Documentation
#[macro_export]
macro_rules! i2f_bits {
    (32 bits) => {
        0x3F800000
    };
    (32 bias) => {
        9
    };
    (64 bits) => {
        0x3FF0000000000000
    };
    (64 bias) => {
        11
    };
}

macro_rules! impl_methods {
    ($size:expr, $bits:tt) => {
        ::paste::paste! {
            #[inline(always)]
            pub fn nextf(&mut self) -> [[<f $bits>]; $size] {
                self.nextu()
                    .map(|x| [<f $bits>]::from_bits((x >> $crate::i2f_bits!($bits bias)) | $crate::i2f_bits!($bits bits)) - 1.0)
            }

            #[inline(always)]
            pub fn randi(&mut self, min: [<i $bits>], max: [<i $bits>]) -> [[<i $bits>]; $size] {
                let range = (max as i128 - min as i128 + 1) as u128;
                self.nextu().map(|x| (((x as u128) * range >> $bits) as [<i $bits>]) + min)
            }

            #[inline(always)]
            pub fn randf(&mut self, min: [<f $bits>], max: [<f $bits>]) -> [[<f $bits>]; $size] {
                self.nextu().map(|x| {
                    let base = [<f $bits>]::from_bits(
                        (x >> $crate::i2f_bits!($bits bias)) | $crate::i2f_bits!($bits bits),
                    ) - 1.0;
                    base * (max - min) + min
                })
            }
        }
    };
}

macro_rules! wide_rotate_left {
    (32 $x:expr, $shift:expr) => {
        ($x << $shift) | ($x >> (32 - $shift))
    };
    (64 $x:expr, $shift:expr) => {
        ($x << $shift) | ($x >> (64 - $shift))
    };
}

macro_rules! wide_rotate_right {
    (32 $x:expr, $shift:expr) => {
        ($x >> $shift) | ($x << (32 - $shift))
    };
    (64 $x:expr, $shift:expr) => {
        ($x >> $shift) | ($x << (64 - $shift))
    };
}

pub(crate) use impl_methods;
pub(crate) use wide_rotate_left;
pub(crate) use wide_rotate_right;