Trait rand::distributions::Distribution
source · [−]pub trait Distribution<T> {
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> T;
fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>ⓘNotable traits for DistIter<D, R, T>impl<D, R, T> Iterator for DistIter<D, R, T> where
D: Distribution<T>,
R: Rng, type Item = T;
where
R: Rng,
Self: Sized,
{ ... }
fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
where
F: Fn(T) -> S,
Self: Sized,
{ ... }
}
Expand description
Types (distributions) that can be used to create a random instance of T
.
It is possible to sample from a distribution through both the
Distribution
and Rng
traits, via distr.sample(&mut rng)
and
rng.sample(distr)
. They also both offer the sample_iter
method, which
produces an iterator that samples from the distribution.
All implementations are expected to be immutable; this has the significant advantage of not needing to consider thread safety, and for most distributions efficient state-less sampling algorithms are available.
Implementations are typically expected to be portable with reproducible
results when used with a PRNG with fixed seed; see the
portability chapter
of The Rust Rand Book. In some cases this does not apply, e.g. the usize
type requires different sampling on 32-bit and 64-bit machines.
Required methods
Provided methods
Create an iterator that generates random values of T
, using rng
as
the source of randomness.
Note that this function takes self
by value. This works since
Distribution<T>
is impl’d for &D
where D: Distribution<T>
,
however borrowing is not automatic hence distr.sample_iter(...)
may
need to be replaced with (&distr).sample_iter(...)
to borrow or
(&*distr).sample_iter(...)
to reborrow an existing reference.
Example
use rand::thread_rng;
use rand::distributions::{Distribution, Alphanumeric, Uniform, Standard};
let mut rng = thread_rng();
// Vec of 16 x f32:
let v: Vec<f32> = Standard.sample_iter(&mut rng).take(16).collect();
// String:
let s: String = Alphanumeric
.sample_iter(&mut rng)
.take(7)
.map(char::from)
.collect();
// Dice-rolling:
let die_range = Uniform::new_inclusive(1, 6);
let mut roll_die = die_range.sample_iter(&mut rng);
while roll_die.next().unwrap() != 6 {
println!("Not a 6; rolling again!");
}
Create a distribution of values of ‘S’ by mapping the output of Self
through the closure F
Example
use rand::thread_rng;
use rand::distributions::{Distribution, Uniform};
let mut rng = thread_rng();
let die = Uniform::new_inclusive(1, 6);
let even_number = die.map(|num| num % 2 == 0);
while !even_number.sample(&mut rng) {
println!("Still odd; rolling again!");
}
Implementations on Foreign Types
sourceimpl<'a, T, D: Distribution<T>> Distribution<T> for &'a D
impl<'a, T, D: Distribution<T>> Distribution<T> for &'a D
Implementors
impl Distribution<bool> for Bernoulli
impl Distribution<bool> for Standard
impl Distribution<char> for Standard
impl Distribution<f32> for Open01
impl Distribution<f32> for OpenClosed01
impl Distribution<f32> for Standard
impl Distribution<f64> for Open01
impl Distribution<f64> for OpenClosed01
impl Distribution<f64> for Standard
impl Distribution<i8> for Standard
impl Distribution<i16> for Standard
impl Distribution<i32> for Standard
impl Distribution<i64> for Standard
impl Distribution<i128> for Standard
impl Distribution<isize> for Standard
impl Distribution<u8> for Alphanumeric
impl Distribution<u8> for Standard
impl Distribution<u16> for Standard
impl Distribution<u32> for Standard
impl Distribution<u64> for Standard
impl Distribution<u128> for Standard
impl Distribution<()> for Standard
impl Distribution<usize> for Standard
impl Distribution<__m128i> for Standard
impl Distribution<__m256i> for Standard
impl Distribution<NonZeroU8> for Standard
impl Distribution<NonZeroU16> for Standard
impl Distribution<NonZeroU32> for Standard
impl Distribution<NonZeroU64> for Standard
impl Distribution<NonZeroU128> for Standard
impl Distribution<NonZeroUsize> for Standard
impl Distribution<Simd<[f32; 2]>> for Open01
impl Distribution<Simd<[f32; 2]>> for OpenClosed01
impl Distribution<Simd<[f32; 2]>> for Standard
impl Distribution<Simd<[f32; 4]>> for Open01
impl Distribution<Simd<[f32; 4]>> for OpenClosed01
impl Distribution<Simd<[f32; 4]>> for Standard
impl Distribution<Simd<[f32; 8]>> for Open01
impl Distribution<Simd<[f32; 8]>> for OpenClosed01
impl Distribution<Simd<[f32; 8]>> for Standard
impl Distribution<Simd<[f32; 16]>> for Open01
impl Distribution<Simd<[f32; 16]>> for OpenClosed01
impl Distribution<Simd<[f32; 16]>> for Standard
impl Distribution<Simd<[f64; 2]>> for Open01
impl Distribution<Simd<[f64; 2]>> for OpenClosed01
impl Distribution<Simd<[f64; 2]>> for Standard
impl Distribution<Simd<[f64; 4]>> for Open01
impl Distribution<Simd<[f64; 4]>> for OpenClosed01
impl Distribution<Simd<[f64; 4]>> for Standard
impl Distribution<Simd<[f64; 8]>> for Open01
impl Distribution<Simd<[f64; 8]>> for OpenClosed01
impl Distribution<Simd<[f64; 8]>> for Standard
impl Distribution<Simd<[i8; 2]>> for Standard
impl Distribution<Simd<[i8; 4]>> for Standard
impl Distribution<Simd<[i8; 8]>> for Standard
impl Distribution<Simd<[i8; 16]>> for Standard
impl Distribution<Simd<[i8; 32]>> for Standard
impl Distribution<Simd<[i8; 64]>> for Standard
impl Distribution<Simd<[i16; 2]>> for Standard
impl Distribution<Simd<[i16; 4]>> for Standard
impl Distribution<Simd<[i16; 8]>> for Standard
impl Distribution<Simd<[i16; 16]>> for Standard
impl Distribution<Simd<[i16; 32]>> for Standard
impl Distribution<Simd<[i32; 2]>> for Standard
impl Distribution<Simd<[i32; 4]>> for Standard
impl Distribution<Simd<[i32; 8]>> for Standard
impl Distribution<Simd<[i32; 16]>> for Standard
impl Distribution<Simd<[i64; 2]>> for Standard
impl Distribution<Simd<[i64; 4]>> for Standard
impl Distribution<Simd<[i64; 8]>> for Standard
impl Distribution<Simd<[u8; 2]>> for Standard
impl Distribution<Simd<[u8; 4]>> for Standard
impl Distribution<Simd<[u8; 8]>> for Standard
impl Distribution<Simd<[u8; 16]>> for Standard
impl Distribution<Simd<[u8; 32]>> for Standard
impl Distribution<Simd<[u8; 64]>> for Standard
impl Distribution<Simd<[u16; 2]>> for Standard
impl Distribution<Simd<[u16; 4]>> for Standard
impl Distribution<Simd<[u16; 8]>> for Standard
impl Distribution<Simd<[u16; 16]>> for Standard
impl Distribution<Simd<[u16; 32]>> for Standard
impl Distribution<Simd<[u32; 2]>> for Standard
impl Distribution<Simd<[u32; 4]>> for Standard
impl Distribution<Simd<[u32; 8]>> for Standard
impl Distribution<Simd<[u32; 16]>> for Standard
impl Distribution<Simd<[u64; 2]>> for Standard
impl Distribution<Simd<[u64; 4]>> for Standard
impl Distribution<Simd<[u64; 8]>> for Standard
impl<'a, T> Distribution<&'a T> for Slice<'a, T>
impl<A> Distribution<(A,)> for Standard where
Standard: Distribution<A>,
impl<A, B> Distribution<(A, B)> for Standard where
Standard: Distribution<A>,
Standard: Distribution<B>,
impl<A, B, C> Distribution<(A, B, C)> for Standard where
Standard: Distribution<A>,
Standard: Distribution<B>,
Standard: Distribution<C>,
impl<A, B, C, D> Distribution<(A, B, C, D)> for Standard where
Standard: Distribution<A>,
Standard: Distribution<B>,
Standard: Distribution<C>,
Standard: Distribution<D>,
impl<A, B, C, D, E> Distribution<(A, B, C, D, E)> for Standard where
Standard: Distribution<A>,
Standard: Distribution<B>,
Standard: Distribution<C>,
Standard: Distribution<D>,
Standard: Distribution<E>,
impl<A, B, C, D, E, F> Distribution<(A, B, C, D, E, F)> for Standard where
Standard: Distribution<A>,
Standard: Distribution<B>,
Standard: Distribution<C>,
Standard: Distribution<D>,
Standard: Distribution<E>,
Standard: Distribution<F>,
impl<A, B, C, D, E, F, G> Distribution<(A, B, C, D, E, F, G)> for Standard where
Standard: Distribution<A>,
Standard: Distribution<B>,
Standard: Distribution<C>,
Standard: Distribution<D>,
Standard: Distribution<E>,
Standard: Distribution<F>,
Standard: Distribution<G>,
impl<A, B, C, D, E, F, G, H> Distribution<(A, B, C, D, E, F, G, H)> for Standard where
Standard: Distribution<A>,
Standard: Distribution<B>,
Standard: Distribution<C>,
Standard: Distribution<D>,
Standard: Distribution<E>,
Standard: Distribution<F>,
Standard: Distribution<G>,
Standard: Distribution<H>,
impl<A, B, C, D, E, F, G, H, I> Distribution<(A, B, C, D, E, F, G, H, I)> for Standard where
Standard: Distribution<A>,
Standard: Distribution<B>,
Standard: Distribution<C>,
Standard: Distribution<D>,
Standard: Distribution<E>,
Standard: Distribution<F>,
Standard: Distribution<G>,
Standard: Distribution<H>,
Standard: Distribution<I>,
impl<A, B, C, D, E, F, G, H, I, J> Distribution<(A, B, C, D, E, F, G, H, I, J)> for Standard where
Standard: Distribution<A>,
Standard: Distribution<B>,
Standard: Distribution<C>,
Standard: Distribution<D>,
Standard: Distribution<E>,
Standard: Distribution<F>,
Standard: Distribution<G>,
Standard: Distribution<H>,
Standard: Distribution<I>,
Standard: Distribution<J>,
impl<A, B, C, D, E, F, G, H, I, J, K> Distribution<(A, B, C, D, E, F, G, H, I, J, K)> for Standard where
Standard: Distribution<A>,
Standard: Distribution<B>,
Standard: Distribution<C>,
Standard: Distribution<D>,
Standard: Distribution<E>,
Standard: Distribution<F>,
Standard: Distribution<G>,
Standard: Distribution<H>,
Standard: Distribution<I>,
Standard: Distribution<J>,
Standard: Distribution<K>,
impl<A, B, C, D, E, F, G, H, I, J, K, L> Distribution<(A, B, C, D, E, F, G, H, I, J, K, L)> for Standard where
Standard: Distribution<A>,
Standard: Distribution<B>,
Standard: Distribution<C>,
Standard: Distribution<D>,
Standard: Distribution<E>,
Standard: Distribution<F>,
Standard: Distribution<G>,
Standard: Distribution<H>,
Standard: Distribution<I>,
Standard: Distribution<J>,
Standard: Distribution<K>,
Standard: Distribution<L>,
impl<D, F, T, S> Distribution<S> for DistMap<D, F, T, S> where
D: Distribution<T>,
F: Fn(T) -> S,
impl<T> Distribution<Option<T>> for Standard where
Standard: Distribution<T>,
impl<T> Distribution<Wrapping<T>> for Standard where
Standard: Distribution<T>,
impl<T, const N: usize> Distribution<[T; N]> for Standard where
Standard: Distribution<T>,
min_const_gen
only.