pub trait Distribution<T> {
// Required method
fn sample<R>(&self, rng: &mut R) -> T
where R: Rng + ?Sized;
// Provided methods
fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, 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§
Sourcefn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T> ⓘ
fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T> ⓘ
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!");
}Sourcefn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
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!");
}Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.
Implementations on Foreign Types§
Source§impl Distribution<f32> for Exp1
impl Distribution<f32> for Exp1
Source§impl Distribution<f32> for StandardNormal
impl Distribution<f32> for StandardNormal
Source§impl Distribution<f64> for Exp1
impl Distribution<f64> for Exp1
Source§impl Distribution<f64> for StandardNormal
impl Distribution<f64> for StandardNormal
Source§impl Distribution<u64> for Binomial
impl Distribution<u64> for Binomial
Source§impl Distribution<u64> for Geometric
impl Distribution<u64> for Geometric
Source§impl Distribution<u64> for StandardGeometric
impl Distribution<u64> for StandardGeometric
Source§impl Distribution<u64> for Hypergeometric
impl Distribution<u64> for Hypergeometric
Source§impl<'a, T, D> Distribution<T> for &'a Dwhere
D: Distribution<T>,
impl<'a, T, D> Distribution<T> for &'a Dwhere
D: Distribution<T>,
Source§impl<F> Distribution<[F; 2]> for UnitCirclewhere
F: Float + SampleUniform,
impl<F> Distribution<[F; 2]> for UnitCirclewhere
F: Float + SampleUniform,
Source§impl<F> Distribution<[F; 2]> for UnitDiscwhere
F: Float + SampleUniform,
impl<F> Distribution<[F; 2]> for UnitDiscwhere
F: Float + SampleUniform,
Source§impl<F> Distribution<[F; 3]> for UnitBallwhere
F: Float + SampleUniform,
impl<F> Distribution<[F; 3]> for UnitBallwhere
F: Float + SampleUniform,
Source§impl<F> Distribution<[F; 3]> for UnitSpherewhere
F: Float + SampleUniform,
impl<F> Distribution<[F; 3]> for UnitSpherewhere
F: Float + SampleUniform,
Source§impl<F> Distribution<F> for Cauchy<F>
impl<F> Distribution<F> for Cauchy<F>
Source§impl<F> Distribution<F> for Exp<F>
impl<F> Distribution<F> for Exp<F>
Source§impl<F> Distribution<F> for Frechet<F>
impl<F> Distribution<F> for Frechet<F>
Source§impl<F> Distribution<F> for Beta<F>
impl<F> Distribution<F> for Beta<F>
Source§impl<F> Distribution<F> for ChiSquared<F>
impl<F> Distribution<F> for ChiSquared<F>
Source§impl<F> Distribution<F> for FisherF<F>
impl<F> Distribution<F> for FisherF<F>
Source§impl<F> Distribution<F> for Gamma<F>
impl<F> Distribution<F> for Gamma<F>
Source§impl<F> Distribution<F> for StudentT<F>
impl<F> Distribution<F> for StudentT<F>
Source§impl<F> Distribution<F> for Gumbel<F>
impl<F> Distribution<F> for Gumbel<F>
Source§impl<F> Distribution<F> for InverseGaussian<F>
impl<F> Distribution<F> for InverseGaussian<F>
Source§impl<F> Distribution<F> for LogNormal<F>
impl<F> Distribution<F> for LogNormal<F>
Source§impl<F> Distribution<F> for Normal<F>
impl<F> Distribution<F> for Normal<F>
Source§impl<F> Distribution<F> for NormalInverseGaussian<F>
impl<F> Distribution<F> for NormalInverseGaussian<F>
Source§impl<F> Distribution<F> for Pareto<F>
impl<F> Distribution<F> for Pareto<F>
Source§impl<F> Distribution<F> for Pert<F>
impl<F> Distribution<F> for Pert<F>
Source§impl<F> Distribution<F> for Poisson<F>
impl<F> Distribution<F> for Poisson<F>
Source§impl<F> Distribution<F> for SkewNormal<F>
impl<F> Distribution<F> for SkewNormal<F>
Source§impl<F> Distribution<F> for Triangular<F>
impl<F> Distribution<F> for Triangular<F>
Source§impl<F> Distribution<F> for Weibull<F>
impl<F> Distribution<F> for Weibull<F>
Source§impl<F> Distribution<F> for Zeta<F>
impl<F> Distribution<F> for Zeta<F>
Source§impl<F> Distribution<F> for Zipf<F>
impl<F> Distribution<F> for Zipf<F>
Implementors§
impl Distribution<bool> for rssn::prelude::rand::distributions::Bernoulli
impl Distribution<bool> for Standard
impl Distribution<bool> for rssn::prelude::statrs::distribution::Bernoulli
rand only.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<f64> for rssn::prelude::statrs::distribution::Bernoulli
rand only.impl Distribution<f64> for rssn::prelude::statrs::distribution::Beta
rand only.impl Distribution<f64> for rssn::prelude::statrs::distribution::Binomial
rand only.impl Distribution<f64> for Categorical
rand only.impl Distribution<f64> for rssn::prelude::statrs::distribution::Cauchy
rand only.impl Distribution<f64> for Chi
rand only.impl Distribution<f64> for rssn::prelude::statrs::distribution::ChiSquared
rand only.impl Distribution<f64> for Dirac
rand only.impl Distribution<f64> for DiscreteUniform
rand only.impl Distribution<f64> for Empirical
rand only.impl Distribution<f64> for Erlang
rand only.impl Distribution<f64> for rssn::prelude::statrs::distribution::Exp
rand only.impl Distribution<f64> for FisherSnedecor
rand only.impl Distribution<f64> for rssn::prelude::statrs::distribution::Gamma
rand only.impl Distribution<f64> for rssn::prelude::statrs::distribution::Geometric
rand only.impl Distribution<f64> for rssn::prelude::statrs::distribution::Gumbel
rand only.impl Distribution<f64> for rssn::prelude::statrs::distribution::Hypergeometric
rand only.impl Distribution<f64> for InverseGamma
rand only.impl Distribution<f64> for Laplace
rand only.impl Distribution<f64> for rssn::prelude::statrs::distribution::LogNormal
rand only.impl Distribution<f64> for rssn::prelude::statrs::distribution::Normal
rand only.impl Distribution<f64> for rssn::prelude::statrs::distribution::Pareto
rand only.impl Distribution<f64> for rssn::prelude::statrs::distribution::Poisson
rand only.impl Distribution<f64> for StudentsT
rand only.impl Distribution<f64> for rssn::prelude::statrs::distribution::Triangular
rand only.impl Distribution<f64> for rssn::prelude::statrs::distribution::Uniform
rand only.impl Distribution<f64> for rssn::prelude::statrs::distribution::Weibull
rand only.impl Distribution<i8> for Standard
impl Distribution<i16> for Standard
impl Distribution<i32> for Standard
impl Distribution<i64> for Standard
impl Distribution<i64> for DiscreteUniform
rand only.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<u64> for rssn::prelude::statrs::distribution::Binomial
rand only.impl Distribution<u64> for Categorical
rand only.impl Distribution<u64> for rssn::prelude::statrs::distribution::Geometric
rand only.impl Distribution<u64> for rssn::prelude::statrs::distribution::Hypergeometric
rand only.impl Distribution<u64> for NegativeBinomial
rand only.impl Distribution<u64> for rssn::prelude::statrs::distribution::Poisson
rand only.impl Distribution<u128> for Standard
impl Distribution<()> for Standard
impl Distribution<usize> for Standard
impl Distribution<usize> for Categorical
rand only.impl Distribution<BigInt> for RandomBits
impl Distribution<BigUint> for RandomBits
impl Distribution<NonZero<u8>> for Standard
impl Distribution<NonZero<u16>> for Standard
impl Distribution<NonZero<u32>> for Standard
impl Distribution<NonZero<u64>> for Standard
impl Distribution<NonZero<u128>> for Standard
impl Distribution<NonZero<usize>> for Standard
impl<'a, T> Distribution<&'a T> for Slice<'a, T>
impl<A> Distribution<(A,)> for Standardwhere
Standard: Distribution<A>,
impl<A, B> Distribution<(A, B)> for Standard
impl<A, B, C> Distribution<(A, B, C)> for Standard
impl<A, B, C, D> Distribution<(A, B, C, D)> for Standard
impl<A, B, C, D, E> Distribution<(A, B, C, D, E)> for Standardwhere
Standard: Distribution<A> + Distribution<B> + Distribution<C> + Distribution<D> + Distribution<E>,
impl<A, B, C, D, E, F> Distribution<(A, B, C, D, E, F)> for Standardwhere
Standard: Distribution<A> + Distribution<B> + Distribution<C> + Distribution<D> + Distribution<E> + Distribution<F>,
impl<A, B, C, D, E, F, G> Distribution<(A, B, C, D, E, F, G)> for Standardwhere
Standard: Distribution<A> + Distribution<B> + Distribution<C> + Distribution<D> + Distribution<E> + Distribution<F> + Distribution<G>,
impl<A, B, C, D, E, F, G, H> Distribution<(A, B, C, D, E, F, G, H)> for Standardwhere
Standard: Distribution<A> + Distribution<B> + Distribution<C> + Distribution<D> + Distribution<E> + Distribution<F> + Distribution<G> + Distribution<H>,
impl<A, B, C, D, E, F, G, H, I> Distribution<(A, B, C, D, E, F, G, H, I)> for Standardwhere
Standard: Distribution<A> + Distribution<B> + Distribution<C> + Distribution<D> + Distribution<E> + Distribution<F> + Distribution<G> + Distribution<H> + 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 Standardwhere
Standard: Distribution<A> + Distribution<B> + Distribution<C> + Distribution<D> + Distribution<E> + Distribution<F> + Distribution<G> + Distribution<H> + Distribution<I> + 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 Standardwhere
Standard: Distribution<A> + Distribution<B> + Distribution<C> + Distribution<D> + Distribution<E> + Distribution<F> + Distribution<G> + Distribution<H> + Distribution<I> + Distribution<J> + 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 Standardwhere
Standard: Distribution<A> + Distribution<B> + Distribution<C> + Distribution<D> + Distribution<E> + Distribution<F> + Distribution<G> + Distribution<H> + Distribution<I> + Distribution<J> + Distribution<K> + Distribution<L>,
impl<D> Distribution<f64> for Data<D>
rand only.impl<D> Distribution<Matrix<f64, D, Const<1>, <DefaultAllocator as Allocator<D>>::Buffer<f64>>> for Dirichlet<D>
rand only.impl<D> Distribution<Matrix<f64, D, Const<1>, <DefaultAllocator as Allocator<D>>::Buffer<f64>>> for Multinomial<D>
rand only.impl<D> Distribution<Matrix<f64, D, Const<1>, <DefaultAllocator as Allocator<D>>::Buffer<f64>>> for MultivariateNormal<D>
rand only.impl<D> Distribution<Matrix<f64, D, Const<1>, <DefaultAllocator as Allocator<D>>::Buffer<f64>>> for MultivariateStudent<D>
rand only.impl<D> Distribution<Matrix<u64, D, Const<1>, <DefaultAllocator as Allocator<D>>::Buffer<u64>>> for Multinomial<D>
rand only.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 Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 0]> for Standard
impl<T> Distribution<[T; 1]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 2]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 3]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 4]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 5]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 6]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 7]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 8]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 9]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 10]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 11]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 12]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 13]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 14]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 15]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 16]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 17]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 18]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 19]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 20]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 21]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 22]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 23]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 24]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 25]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 26]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 27]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 28]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 29]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 30]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 31]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<[T; 32]> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<Wrapping<T>> for Standardwhere
Standard: Distribution<T>,
impl<T> Distribution<Unit<Complex<T>>> for Standard
rand only.impl<T> Distribution<Unit<Quaternion<T>>> for Standardwhere
T: SimdRealField + SampleUniform,
<T as SimdValue>::Element: SimdRealField,
OpenClosed01: Distribution<T>,
rand-no-std only.impl<T> Distribution<Orthographic3<T>> for Standard
rand-no-std only.impl<T> Distribution<Perspective3<T>> for Standard
rand-no-std only.impl<T> Distribution<Quaternion<T>> for Standard
rand-no-std only.impl<T> Distribution<Rotation<T, 2>> for Standard
rand-no-std only.impl<T> Distribution<Rotation<T, 3>> for Standardwhere
T: SimdRealField + SampleUniform,
<T as SimdValue>::Element: SimdRealField,
OpenClosed01: Distribution<T>,
rand-no-std only.impl<T, D> Distribution<Unit<Matrix<T, D, Const<1>, <DefaultAllocator as Allocator<D>>::Buffer<T>>>> for Standard
rand only.impl<T, D> Distribution<OPoint<T, D>> for Standard
rand-no-std only.impl<T, R, C> Distribution<Matrix<T, R, C, <DefaultAllocator as Allocator<R, C>>::Buffer<T>>> for Standard
rand-no-std only.impl<T, R, const D: usize> Distribution<Isometry<T, R, D>> for Standard
rand-no-std only.impl<T, R, const D: usize> Distribution<Similarity<T, R, D>> for Standard
rand-no-std only.impl<T, const D: usize> Distribution<Scale<T, D>> for Standard
rand-no-std only.impl<T, const D: usize> Distribution<Translation<T, D>> for Standard
rand-no-std only.