[][src]Struct rand::distributions::uniform::UniformInt

pub struct UniformInt<X> { /* fields omitted */ }

The back-end implementing UniformSampler for integer types.

Unless you are implementing UniformSampler for your own type, this type should not be used directly, use Uniform instead.

Implementation notes

For a closed range, the number of possible numbers we should generate is range = (high - low + 1). It is not possible to end up with a uniform distribution if we map all the random integers that can be generated to this range. We have to map integers from a zone that is a multiple of the range. The rest of the integers, that cause a bias, are rejected.

The problem with range is that to cover the full range of the type, it has to store unsigned_max + 1, which can't be represented. But if the range covers the full range of the type, no modulus is needed. A range of size 0 can't exist, so we use that to represent this special case. Wrapping arithmetic even makes representing unsigned_max + 1 as 0 simple.

We don't calculate zone directly, but first calculate the number of integers to reject. To handle unsigned_max + 1 not fitting in the type, we use: ints_to_reject = (unsigned_max + 1) % range; ints_to_reject = (unsigned_max - range + 1) % range;

The smallest integer PRNGs generate is u32. That is why for small integer sizes (i8/u8 and i16/u16) there is an optimization: don't pick the largest zone that can fit in the small type, but pick the largest zone that can fit in an u32. ints_to_reject is always less than half the size of the small integer. This means the first bit of zone is always 1, and so are all the other preceding bits of a larger integer. The easiest way to grow the zone for the larger type is to simply sign extend it.

An alternative to using a modulus is widening multiply: After a widening multiply by range, the result is in the high word. Then comparing the low word against zone makes sure our distribution is uniform.

Trait Implementations

impl<X: Clone> Clone for UniformInt<X>[src]

impl<X: Copy> Copy for UniformInt<X>[src]

impl<X: Debug> Debug for UniformInt<X>[src]

impl UniformSampler for UniformInt<i8>[src]

type X = i8

The type sampled by this implementation.

impl UniformSampler for UniformInt<i16>[src]

type X = i16

The type sampled by this implementation.

impl UniformSampler for UniformInt<i32>[src]

type X = i32

The type sampled by this implementation.

impl UniformSampler for UniformInt<i64>[src]

type X = i64

The type sampled by this implementation.

impl UniformSampler for UniformInt<isize>[src]

type X = isize

The type sampled by this implementation.

impl UniformSampler for UniformInt<u8>[src]

type X = u8

The type sampled by this implementation.

impl UniformSampler for UniformInt<u16>[src]

type X = u16

The type sampled by this implementation.

impl UniformSampler for UniformInt<u32>[src]

type X = u32

The type sampled by this implementation.

impl UniformSampler for UniformInt<u64>[src]

type X = u64

The type sampled by this implementation.

impl UniformSampler for UniformInt<usize>[src]

type X = usize

The type sampled by this implementation.

Auto Trait Implementations

impl<X> RefUnwindSafe for UniformInt<X> where
    X: RefUnwindSafe

impl<X> Send for UniformInt<X> where
    X: Send

impl<X> Sync for UniformInt<X> where
    X: Sync

impl<X> Unpin for UniformInt<X> where
    X: Unpin

impl<X> UnwindSafe for UniformInt<X> where
    X: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.