pub struct Uniform<X>(/* private fields */)
where
X: SampleUniform;
Expand description
Sample values uniformly between two bounds.
§Construction
Uniform::new
and Uniform::new_inclusive
construct a uniform
distribution sampling from the given low
and high
limits. Uniform
may
also be constructed via TryFrom
as in Uniform::try_from(1..=6).unwrap()
.
Constructors may do extra work up front to allow faster sampling of multiple
values. Where only a single sample is required it is suggested to use
Rng::random_range
or one of the sample_single
methods instead.
When sampling from a constant range, many calculations can happen at
compile-time and all methods should be fast; for floating-point ranges and
the full range of integer types, this should have comparable performance to
the StandardUniform
distribution.
§Provided implementations
char
(UniformChar
): samples a range over the implementation foru32
f32
,f64
(UniformFloat
): samples approximately uniformly within a range; bias may be present in the least-significant bit of the significand and the limits of the input range may be sampled even when an open (exclusive) range is used- Integer types (
UniformInt
) may show a small bias relative to the expected uniform distribution of output. In the worst case, bias affects 1 in2^n
samples where n is 56 (i8
andu8
), 48 (i16
andu16
), 96 (i32
andu32
), 64 (i64
andu64
), 128 (i128
andu128
). Theunbiased
feature flag fixes this bias. usize
(UniformUsize
) is handled specially, using theu32
implementation where possible to enable portable results across 32-bit and 64-bit CPU architectures.Duration
(UniformDuration
): samples a range over the implementation foru32
oru64
- SIMD types (requires
simd_support
feature) like x86’s__m128i
andstd::simd
’su32x4
,f32x4
andmask32x4
types are effectively arrays of integer or floating-point types. Each lane is sampled independently from its own range, potentially with more efficient random-bit-usage than would be achieved with sequential sampling.
§Example
use rand::distr::{Distribution, Uniform};
let between = Uniform::try_from(10..10000).unwrap();
let mut rng = rand::rng();
let mut sum = 0;
for _ in 0..1000 {
sum += between.sample(&mut rng);
}
println!("{}", sum);
For a single sample, Rng::random_range
may be preferred:
use rand::Rng;
let mut rng = rand::rng();
println!("{}", rng.random_range(0..10));
Implementations§
Source§impl<X> Uniform<X>where
X: SampleUniform,
impl<X> Uniform<X>where
X: SampleUniform,
Sourcepub fn new<B1, B2>(low: B1, high: B2) -> Result<Uniform<X>, Error>where
B1: SampleBorrow<X>,
B2: SampleBorrow<X>,
pub fn new<B1, B2>(low: B1, high: B2) -> Result<Uniform<X>, Error>where
B1: SampleBorrow<X>,
B2: SampleBorrow<X>,
Create a new Uniform
instance, which samples uniformly from the half
open range [low, high)
(excluding high
).
For discrete types (e.g. integers), samples will always be strictly less
than high
. For (approximations of) continuous types (e.g. f32
, f64
),
samples may equal high
due to loss of precision but may not be
greater than high
.
Fails if low >= high
, or if low
, high
or the range high - low
is
non-finite. In release mode, only the range is checked.
Sourcepub fn new_inclusive<B1, B2>(low: B1, high: B2) -> Result<Uniform<X>, Error>where
B1: SampleBorrow<X>,
B2: SampleBorrow<X>,
pub fn new_inclusive<B1, B2>(low: B1, high: B2) -> Result<Uniform<X>, Error>where
B1: SampleBorrow<X>,
B2: SampleBorrow<X>,
Create a new Uniform
instance, which samples uniformly from the closed
range [low, high]
(inclusive).
Fails if low > high
, or if low
, high
or the range high - low
is
non-finite. In release mode, only the range is checked.
Trait Implementations§
Source§impl<X> Distribution<X> for Uniform<X>where
X: SampleUniform,
impl<X> Distribution<X> for Uniform<X>where
X: SampleUniform,
Source§impl SampleString for Uniform<char>
impl SampleString for Uniform<char>
Source§impl<X> TryFrom<RangeInclusive<X>> for Uniform<X>where
X: SampleUniform,
impl<X> TryFrom<RangeInclusive<X>> for Uniform<X>where
X: SampleUniform,
impl<X> Copy for Uniform<X>
impl<X> Eq for Uniform<X>
impl<X> StructuralPartialEq for Uniform<X>where
X: SampleUniform,
Auto Trait Implementations§
impl<X> Freeze for Uniform<X>
impl<X> RefUnwindSafe for Uniform<X>
impl<X> Send for Uniform<X>
impl<X> Sync for Uniform<X>
impl<X> Unpin for Uniform<X>
impl<X> UnwindSafe for Uniform<X>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more§impl<T> Pointable for T
impl<T> Pointable for T
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self
from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self
is actually part of its subset T
(and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset
but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self
to the equivalent element of its superset.