Trait rand::distributions::uniform::UniformSampler
source · pub trait UniformSampler: Sized {
type X;
fn new<B1, B2>(low: B1, high: B2) -> Self
where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized;
fn new_inclusive<B1, B2>(low: B1, high: B2) -> Self
where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized;
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X;
fn sample_single<R: Rng + ?Sized, B1, B2>(
low: B1,
high: B2,
rng: &mut R
) -> Self::X
where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
{ ... }
fn sample_single_inclusive<R: Rng + ?Sized, B1, B2>(
low: B1,
high: B2,
rng: &mut R
) -> Self::X
where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
{ ... }
}
Expand description
Helper trait handling actual uniform sampling.
See the module documentation on how to implement Uniform
range
sampling for a custom type.
Implementation of sample_single
is optional, and is only useful when
the implementation can be faster than Self::new(low, high).sample(rng)
.
Required Associated Types§
Required Methods§
sourcefn new<B1, B2>(low: B1, high: B2) -> Selfwhere
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn new<B1, B2>(low: B1, high: B2) -> Selfwhere
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
Construct self, with inclusive lower bound and exclusive upper bound
[low, high)
.
Usually users should not call this directly but instead use
Uniform::new
, which asserts that low < high
before calling this.
sourcefn new_inclusive<B1, B2>(low: B1, high: B2) -> Selfwhere
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn new_inclusive<B1, B2>(low: B1, high: B2) -> Selfwhere
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
Construct self, with inclusive bounds [low, high]
.
Usually users should not call this directly but instead use
Uniform::new_inclusive
, which asserts that low <= high
before
calling this.
Provided Methods§
sourcefn sample_single<R: Rng + ?Sized, B1, B2>(
low: B1,
high: B2,
rng: &mut R
) -> Self::Xwhere
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn sample_single<R: Rng + ?Sized, B1, B2>(
low: B1,
high: B2,
rng: &mut R
) -> Self::Xwhere
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
Sample a single value uniformly from a range with inclusive lower bound
and exclusive upper bound [low, high)
.
By default this is implemented using
UniformSampler::new(low, high).sample(rng)
. However, for some types
more optimal implementations for single usage may be provided via this
method (which is the case for integers and floats).
Results may not be identical.
Note that to use this method in a generic context, the type needs to be
retrieved via SampleUniform::Sampler
as follows:
use rand::{thread_rng, distributions::uniform::{SampleUniform, UniformSampler}};
fn sample_from_range<T: SampleUniform>(lb: T, ub: T) -> T {
let mut rng = thread_rng();
<T as SampleUniform>::Sampler::sample_single(lb, ub, &mut rng)
}
sourcefn sample_single_inclusive<R: Rng + ?Sized, B1, B2>(
low: B1,
high: B2,
rng: &mut R
) -> Self::Xwhere
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
fn sample_single_inclusive<R: Rng + ?Sized, B1, B2>(
low: B1,
high: B2,
rng: &mut R
) -> Self::Xwhere
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
Sample a single value uniformly from a range with inclusive lower bound
and inclusive upper bound [low, high]
.
By default this is implemented using
UniformSampler::new_inclusive(low, high).sample(rng)
. However, for
some types more optimal implementations for single usage may be provided
via this method.
Results may not be identical.