[−][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]
impl UniformSampler for UniformInt<i8>
type X = i8
The type sampled by this implementation.
fn new(low: Self::X, high: Self::X) -> Self
[src]
fn new(low: Self::X, high: Self::X) -> Self
Construct self, with inclusive lower bound and exclusive upper bound [low, high)
. Read more
fn new_inclusive(low: Self::X, high: Self::X) -> Self
[src]
fn new_inclusive(low: Self::X, high: Self::X) -> Self
Construct self, with inclusive bounds [low, high]
. Read more
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
Sample a value.
fn sample_single<R: Rng + ?Sized>(
low: Self::X,
high: Self::X,
rng: &mut R
) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized>(
low: Self::X,
high: Self::X,
rng: &mut R
) -> Self::X
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]
impl UniformSampler for UniformInt<i16>
type X = i16
The type sampled by this implementation.
fn new(low: Self::X, high: Self::X) -> Self
[src]
fn new(low: Self::X, high: Self::X) -> Self
Construct self, with inclusive lower bound and exclusive upper bound [low, high)
. Read more
fn new_inclusive(low: Self::X, high: Self::X) -> Self
[src]
fn new_inclusive(low: Self::X, high: Self::X) -> Self
Construct self, with inclusive bounds [low, high]
. Read more
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
Sample a value.
fn sample_single<R: Rng + ?Sized>(
low: Self::X,
high: Self::X,
rng: &mut R
) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized>(
low: Self::X,
high: Self::X,
rng: &mut R
) -> Self::X
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]
impl UniformSampler for UniformInt<i32>
type X = i32
The type sampled by this implementation.
fn new(low: Self::X, high: Self::X) -> Self
[src]
fn new(low: Self::X, high: Self::X) -> Self
Construct self, with inclusive lower bound and exclusive upper bound [low, high)
. Read more
fn new_inclusive(low: Self::X, high: Self::X) -> Self
[src]
fn new_inclusive(low: Self::X, high: Self::X) -> Self
Construct self, with inclusive bounds [low, high]
. Read more
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
Sample a value.
fn sample_single<R: Rng + ?Sized>(
low: Self::X,
high: Self::X,
rng: &mut R
) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized>(
low: Self::X,
high: Self::X,
rng: &mut R
) -> Self::X
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]
impl UniformSampler for UniformInt<i64>
type X = i64
The type sampled by this implementation.
fn new(low: Self::X, high: Self::X) -> Self
[src]
fn new(low: Self::X, high: Self::X) -> Self
Construct self, with inclusive lower bound and exclusive upper bound [low, high)
. Read more
fn new_inclusive(low: Self::X, high: Self::X) -> Self
[src]
fn new_inclusive(low: Self::X, high: Self::X) -> Self
Construct self, with inclusive bounds [low, high]
. Read more
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
Sample a value.
fn sample_single<R: Rng + ?Sized>(
low: Self::X,
high: Self::X,
rng: &mut R
) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized>(
low: Self::X,
high: Self::X,
rng: &mut R
) -> Self::X
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]
impl UniformSampler for UniformInt<isize>
type X = isize
The type sampled by this implementation.
fn new(low: Self::X, high: Self::X) -> Self
[src]
fn new(low: Self::X, high: Self::X) -> Self
Construct self, with inclusive lower bound and exclusive upper bound [low, high)
. Read more
fn new_inclusive(low: Self::X, high: Self::X) -> Self
[src]
fn new_inclusive(low: Self::X, high: Self::X) -> Self
Construct self, with inclusive bounds [low, high]
. Read more
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
Sample a value.
fn sample_single<R: Rng + ?Sized>(
low: Self::X,
high: Self::X,
rng: &mut R
) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized>(
low: Self::X,
high: Self::X,
rng: &mut R
) -> Self::X
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]
impl UniformSampler for UniformInt<u8>
type X = u8
The type sampled by this implementation.
fn new(low: Self::X, high: Self::X) -> Self
[src]
fn new(low: Self::X, high: Self::X) -> Self
Construct self, with inclusive lower bound and exclusive upper bound [low, high)
. Read more
fn new_inclusive(low: Self::X, high: Self::X) -> Self
[src]
fn new_inclusive(low: Self::X, high: Self::X) -> Self
Construct self, with inclusive bounds [low, high]
. Read more
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
Sample a value.
fn sample_single<R: Rng + ?Sized>(
low: Self::X,
high: Self::X,
rng: &mut R
) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized>(
low: Self::X,
high: Self::X,
rng: &mut R
) -> Self::X
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]
impl UniformSampler for UniformInt<u16>
type X = u16
The type sampled by this implementation.
fn new(low: Self::X, high: Self::X) -> Self
[src]
fn new(low: Self::X, high: Self::X) -> Self
Construct self, with inclusive lower bound and exclusive upper bound [low, high)
. Read more
fn new_inclusive(low: Self::X, high: Self::X) -> Self
[src]
fn new_inclusive(low: Self::X, high: Self::X) -> Self
Construct self, with inclusive bounds [low, high]
. Read more
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
Sample a value.
fn sample_single<R: Rng + ?Sized>(
low: Self::X,
high: Self::X,
rng: &mut R
) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized>(
low: Self::X,
high: Self::X,
rng: &mut R
) -> Self::X
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]
impl UniformSampler for UniformInt<u32>
type X = u32
The type sampled by this implementation.
fn new(low: Self::X, high: Self::X) -> Self
[src]
fn new(low: Self::X, high: Self::X) -> Self
Construct self, with inclusive lower bound and exclusive upper bound [low, high)
. Read more
fn new_inclusive(low: Self::X, high: Self::X) -> Self
[src]
fn new_inclusive(low: Self::X, high: Self::X) -> Self
Construct self, with inclusive bounds [low, high]
. Read more
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
Sample a value.
fn sample_single<R: Rng + ?Sized>(
low: Self::X,
high: Self::X,
rng: &mut R
) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized>(
low: Self::X,
high: Self::X,
rng: &mut R
) -> Self::X
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]
impl UniformSampler for UniformInt<u64>
type X = u64
The type sampled by this implementation.
fn new(low: Self::X, high: Self::X) -> Self
[src]
fn new(low: Self::X, high: Self::X) -> Self
Construct self, with inclusive lower bound and exclusive upper bound [low, high)
. Read more
fn new_inclusive(low: Self::X, high: Self::X) -> Self
[src]
fn new_inclusive(low: Self::X, high: Self::X) -> Self
Construct self, with inclusive bounds [low, high]
. Read more
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
Sample a value.
fn sample_single<R: Rng + ?Sized>(
low: Self::X,
high: Self::X,
rng: &mut R
) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized>(
low: Self::X,
high: Self::X,
rng: &mut R
) -> Self::X
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]
impl UniformSampler for UniformInt<usize>
type X = usize
The type sampled by this implementation.
fn new(low: Self::X, high: Self::X) -> Self
[src]
fn new(low: Self::X, high: Self::X) -> Self
Construct self, with inclusive lower bound and exclusive upper bound [low, high)
. Read more
fn new_inclusive(low: Self::X, high: Self::X) -> Self
[src]
fn new_inclusive(low: Self::X, high: Self::X) -> Self
Construct self, with inclusive bounds [low, high]
. Read more
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
[src]
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X
Sample a value.
fn sample_single<R: Rng + ?Sized>(
low: Self::X,
high: Self::X,
rng: &mut R
) -> Self::X
[src]
fn sample_single<R: Rng + ?Sized>(
low: Self::X,
high: Self::X,
rng: &mut R
) -> Self::X
Sample a single value uniformly from a range with inclusive lower bound and exclusive upper bound [low, high)
. Read more
impl<X: Clone> Clone for UniformInt<X>
[src]
impl<X: Clone> Clone for UniformInt<X>
fn clone(&self) -> UniformInt<X>
[src]
fn clone(&self) -> UniformInt<X>
Returns a copy of the value. Read more
fn clone_from(&mut self, source: &Self)
1.0.0[src]
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source
. Read more
impl<X: Copy> Copy for UniformInt<X>
[src]
impl<X: Copy> Copy for UniformInt<X>
impl<X: Debug> Debug for UniformInt<X>
[src]
impl<X: Debug> Debug for UniformInt<X>
Auto Trait Implementations
impl<X> Send for UniformInt<X> where
X: Send,
impl<X> Send for UniformInt<X> where
X: Send,
impl<X> Sync for UniformInt<X> where
X: Sync,
impl<X> Sync for UniformInt<X> where
X: Sync,
Blanket Implementations
impl<T, U> Into for T where
U: From<T>,
[src]
impl<T, U> Into for T where
U: From<T>,
impl<T> ToOwned for T where
T: Clone,
[src]
impl<T> ToOwned for T where
T: Clone,
type Owned = T
fn to_owned(&self) -> T
[src]
fn to_owned(&self) -> T
Creates owned data from borrowed data, usually by cloning. Read more
fn clone_into(&self, target: &mut T)
[src]
fn clone_into(&self, target: &mut T)
🔬 This is a nightly-only experimental API. (toowned_clone_into
)
recently added
Uses borrowed data to replace owned data, usually by cloning. Read more
impl<T> From for T
[src]
impl<T> From for T
impl<T, U> TryFrom for T where
T: From<U>,
[src]
impl<T, U> TryFrom for T where
T: From<U>,
type Error = !
try_from
)The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
try_from
)Performs the conversion.
impl<T> Borrow for T where
T: ?Sized,
[src]
impl<T> Borrow for T where
T: ?Sized,
impl<T> BorrowMut for T where
T: ?Sized,
[src]
impl<T> BorrowMut for T where
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
[src]
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
impl<T, U> TryInto for T where
U: TryFrom<T>,
[src]
impl<T, U> TryInto for T where
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
try_from
)The type returned in the event of a conversion error.
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
try_from
)Performs the conversion.
impl<T> Any for T where
T: 'static + ?Sized,
[src]
impl<T> Any for T where
T: 'static + ?Sized,
fn get_type_id(&self) -> TypeId
[src]
fn get_type_id(&self) -> TypeId
🔬 This is a nightly-only experimental API. (get_type_id
)
this method will likely be replaced by an associated static
Gets the TypeId
of self
. Read more