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

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]

[src]

Returns a copy of the value. Read more

1.0.0
[src]

Performs copy-assignment from source. Read more

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

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

[src]

Formats the value using the given formatter. Read more

impl UniformSampler for UniformInt<i8>
[src]

The type sampled by this implementation.

[src]

Construct self, with inclusive lower bound and exclusive upper bound [low, high). Read more

[src]

Construct self, with inclusive bounds [low, high]. Read more

[src]

Sample a value.

[src]

Sample a single value uniformly from a range with inclusive lower bound and exclusive upper bound [low, high). Read more

impl UniformSampler for UniformInt<i16>
[src]

The type sampled by this implementation.

[src]

Construct self, with inclusive lower bound and exclusive upper bound [low, high). Read more

[src]

Construct self, with inclusive bounds [low, high]. Read more

[src]

Sample a value.

[src]

Sample a single value uniformly from a range with inclusive lower bound and exclusive upper bound [low, high). Read more

impl UniformSampler for UniformInt<i32>
[src]

The type sampled by this implementation.

[src]

Construct self, with inclusive lower bound and exclusive upper bound [low, high). Read more

[src]

Construct self, with inclusive bounds [low, high]. Read more

[src]

Sample a value.

[src]

Sample a single value uniformly from a range with inclusive lower bound and exclusive upper bound [low, high). Read more

impl UniformSampler for UniformInt<i64>
[src]

The type sampled by this implementation.

[src]

Construct self, with inclusive lower bound and exclusive upper bound [low, high). Read more

[src]

Construct self, with inclusive bounds [low, high]. Read more

[src]

Sample a value.

[src]

Sample a single value uniformly from a range with inclusive lower bound and exclusive upper bound [low, high). Read more

impl UniformSampler for UniformInt<i128>
[src]

The type sampled by this implementation.

[src]

Construct self, with inclusive lower bound and exclusive upper bound [low, high). Read more

[src]

Construct self, with inclusive bounds [low, high]. Read more

[src]

Sample a value.

[src]

Sample a single value uniformly from a range with inclusive lower bound and exclusive upper bound [low, high). Read more

impl UniformSampler for UniformInt<isize>
[src]

The type sampled by this implementation.

[src]

Construct self, with inclusive lower bound and exclusive upper bound [low, high). Read more

[src]

Construct self, with inclusive bounds [low, high]. Read more

[src]

Sample a value.

[src]

Sample a single value uniformly from a range with inclusive lower bound and exclusive upper bound [low, high). Read more

impl UniformSampler for UniformInt<u8>
[src]

The type sampled by this implementation.

[src]

Construct self, with inclusive lower bound and exclusive upper bound [low, high). Read more

[src]

Construct self, with inclusive bounds [low, high]. Read more

[src]

Sample a value.

[src]

Sample a single value uniformly from a range with inclusive lower bound and exclusive upper bound [low, high). Read more

impl UniformSampler for UniformInt<u16>
[src]

The type sampled by this implementation.

[src]

Construct self, with inclusive lower bound and exclusive upper bound [low, high). Read more

[src]

Construct self, with inclusive bounds [low, high]. Read more

[src]

Sample a value.

[src]

Sample a single value uniformly from a range with inclusive lower bound and exclusive upper bound [low, high). Read more

impl UniformSampler for UniformInt<u32>
[src]

The type sampled by this implementation.

[src]

Construct self, with inclusive lower bound and exclusive upper bound [low, high). Read more

[src]

Construct self, with inclusive bounds [low, high]. Read more

[src]

Sample a value.

[src]

Sample a single value uniformly from a range with inclusive lower bound and exclusive upper bound [low, high). Read more

impl UniformSampler for UniformInt<u64>
[src]

The type sampled by this implementation.

[src]

Construct self, with inclusive lower bound and exclusive upper bound [low, high). Read more

[src]

Construct self, with inclusive bounds [low, high]. Read more

[src]

Sample a value.

[src]

Sample a single value uniformly from a range with inclusive lower bound and exclusive upper bound [low, high). Read more

impl UniformSampler for UniformInt<usize>
[src]

The type sampled by this implementation.

[src]

Construct self, with inclusive lower bound and exclusive upper bound [low, high). Read more

[src]

Construct self, with inclusive bounds [low, high]. Read more

[src]

Sample a value.

[src]

Sample a single value uniformly from a range with inclusive lower bound and exclusive upper bound [low, high). Read more

impl UniformSampler for UniformInt<u128>
[src]

The type sampled by this implementation.

[src]

Construct self, with inclusive lower bound and exclusive upper bound [low, high). Read more

[src]

Construct self, with inclusive bounds [low, high]. Read more

[src]

Sample a value.

[src]

Sample a single value uniformly from a range with inclusive lower bound and exclusive upper bound [low, high). Read more

Auto Trait Implementations

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

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