[−][src]Struct rand::distributions::uniform::UniformInt
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 UniformSampler for UniformInt<i8>
[src]
type X = i8
The type sampled by this implementation.
fn new<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized, B1, B2>(
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
impl UniformSampler for UniformInt<i16>
[src]
type X = i16
The type sampled by this implementation.
fn new<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized, B1, B2>(
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
impl UniformSampler for UniformInt<i32>
[src]
type X = i32
The type sampled by this implementation.
fn new<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized, B1, B2>(
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
impl UniformSampler for UniformInt<i64>
[src]
type X = i64
The type sampled by this implementation.
fn new<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized, B1, B2>(
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
impl UniformSampler for UniformInt<i128>
[src]
type X = i128
The type sampled by this implementation.
fn new<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized, B1, B2>(
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
impl UniformSampler for UniformInt<isize>
[src]
type X = isize
The type sampled by this implementation.
fn new<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized, B1, B2>(
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
impl UniformSampler for UniformInt<u8>
[src]
type X = u8
The type sampled by this implementation.
fn new<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized, B1, B2>(
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
impl UniformSampler for UniformInt<u16>
[src]
type X = u16
The type sampled by this implementation.
fn new<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized, B1, B2>(
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
impl UniformSampler for UniformInt<u32>
[src]
type X = u32
The type sampled by this implementation.
fn new<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized, B1, B2>(
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
impl UniformSampler for UniformInt<u64>
[src]
type X = u64
The type sampled by this implementation.
fn new<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized, B1, B2>(
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
impl UniformSampler for UniformInt<usize>
[src]
type X = usize
The type sampled by this implementation.
fn new<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized, B1, B2>(
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
impl UniformSampler for UniformInt<u128>
[src]
type X = u128
The type sampled by this implementation.
fn new<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized, B1, B2>(
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
[src]
low_b: B1,
high_b: B2,
rng: &mut R
) -> Self::X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
impl<X: Clone> Clone for UniformInt<X>
[src]
fn clone(&self) -> UniformInt<X>
[src]
fn clone_from(&mut self, source: &Self)
1.0.0[src]
impl<X: Copy> Copy for UniformInt<X>
[src]
impl<X: Debug> Debug for UniformInt<X>
[src]
Auto Trait Implementations
impl<X> Send for UniformInt<X> where
X: Send,
X: Send,
impl<X> Unpin for UniformInt<X> where
X: Unpin,
X: Unpin,
impl<X> Sync for UniformInt<X> where
X: Sync,
X: Sync,
impl<X> UnwindSafe for UniformInt<X> where
X: UnwindSafe,
X: UnwindSafe,
impl<X> RefUnwindSafe for UniformInt<X> where
X: RefUnwindSafe,
X: RefUnwindSafe,
Blanket Implementations
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
fn to_owned(&self) -> T
[src]
fn clone_into(&self, target: &mut T)
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> From<T> for T
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,