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<bool> for Bernoulli
impl Distribution<bool> for Bernoulli
Source§impl Distribution<f64> for Bernoulli
impl Distribution<f64> for Bernoulli
Source§impl Distribution<f64> for Beta
impl Distribution<f64> for Beta
Source§impl Distribution<f64> for Binomial
impl Distribution<f64> for Binomial
Source§impl Distribution<f64> for Categorical
impl Distribution<f64> for Categorical
Source§impl Distribution<f64> for Cauchy
impl Distribution<f64> for Cauchy
Source§impl Distribution<f64> for Chi
impl Distribution<f64> for Chi
Source§impl Distribution<f64> for ChiSquared
impl Distribution<f64> for ChiSquared
Source§impl Distribution<f64> for Dirac
impl Distribution<f64> for Dirac
Source§impl Distribution<f64> for DiscreteUniform
impl Distribution<f64> for DiscreteUniform
Source§impl Distribution<f64> for Empirical
impl Distribution<f64> for Empirical
Source§impl Distribution<f64> for Erlang
impl Distribution<f64> for Erlang
Source§impl Distribution<f64> for Exp
impl Distribution<f64> for Exp
Source§impl Distribution<f64> for FisherSnedecor
impl Distribution<f64> for FisherSnedecor
Source§impl Distribution<f64> for Gamma
impl Distribution<f64> for Gamma
Source§impl Distribution<f64> for Geometric
impl Distribution<f64> for Geometric
Source§impl Distribution<f64> for Gumbel
impl Distribution<f64> for Gumbel
Source§impl Distribution<f64> for Hypergeometric
impl Distribution<f64> for Hypergeometric
Source§impl Distribution<f64> for InverseGamma
impl Distribution<f64> for InverseGamma
Source§impl Distribution<f64> for Laplace
impl Distribution<f64> for Laplace
Source§impl Distribution<f64> for LogNormal
impl Distribution<f64> for LogNormal
Source§impl Distribution<f64> for Normal
impl Distribution<f64> for Normal
Source§impl Distribution<f64> for Pareto
impl Distribution<f64> for Pareto
Source§impl Distribution<f64> for Poisson
impl Distribution<f64> for Poisson
Source§fn sample<R>(&self, rng: &mut R) -> f64
fn sample<R>(&self, rng: &mut R) -> f64
Generates one sample from the Poisson distribution either by Knuth’s method if lambda < 30.0 or Rejection method PA by A. C. Atkinson from the Journal of the Royal Statistical Society Series C (Applied Statistics) Vol. 28 No. 1. (1979) pp. 29 - 35 otherwise
Source§impl Distribution<f64> for StudentsT
impl Distribution<f64> for StudentsT
Source§impl Distribution<f64> for Triangular
impl Distribution<f64> for Triangular
Source§impl Distribution<f64> for Uniform
impl Distribution<f64> for Uniform
Source§impl Distribution<f64> for Weibull
impl Distribution<f64> for Weibull
Source§impl Distribution<i64> for DiscreteUniform
impl Distribution<i64> for DiscreteUniform
Source§impl Distribution<u64> for Binomial
impl Distribution<u64> for Binomial
Source§impl Distribution<u64> for Categorical
impl Distribution<u64> for Categorical
Source§impl Distribution<u64> for Geometric
impl Distribution<u64> for Geometric
Source§impl Distribution<u64> for Hypergeometric
impl Distribution<u64> for Hypergeometric
Source§impl Distribution<u64> for NegativeBinomial
impl Distribution<u64> for NegativeBinomial
Source§impl Distribution<u64> for Poisson
impl Distribution<u64> for Poisson
Source§fn sample<R>(&self, rng: &mut R) -> u64
fn sample<R>(&self, rng: &mut R) -> u64
Generates one sample from the Poisson distribution either by Knuth’s method if lambda < 30.0 or Rejection method PA by A. C. Atkinson from the Journal of the Royal Statistical Society Series C (Applied Statistics) Vol. 28 No. 1. (1979) pp. 29 - 35 otherwise
Source§impl Distribution<usize> for Categorical
impl Distribution<usize> for Categorical
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<D> Distribution<f64> for Data<D>
impl<D> Distribution<f64> for Data<D>
Source§impl<D> Distribution<Matrix<f64, D, Const<1>, <DefaultAllocator as Allocator<D>>::Buffer<f64>>> for Dirichlet<D>
impl<D> Distribution<Matrix<f64, D, Const<1>, <DefaultAllocator as Allocator<D>>::Buffer<f64>>> for Dirichlet<D>
Source§impl<D> Distribution<Matrix<f64, D, Const<1>, <DefaultAllocator as Allocator<D>>::Buffer<f64>>> for Multinomial<D>
impl<D> Distribution<Matrix<f64, D, Const<1>, <DefaultAllocator as Allocator<D>>::Buffer<f64>>> for Multinomial<D>
Source§impl<D> Distribution<Matrix<f64, D, Const<1>, <DefaultAllocator as Allocator<D>>::Buffer<f64>>> for MultivariateNormal<D>
impl<D> Distribution<Matrix<f64, D, Const<1>, <DefaultAllocator as Allocator<D>>::Buffer<f64>>> for MultivariateNormal<D>
Source§fn sample<R>(
&self,
rng: &mut R,
) -> Matrix<f64, D, Const<1>, <DefaultAllocator as Allocator<D>>::Buffer<f64>>
fn sample<R>( &self, rng: &mut R, ) -> Matrix<f64, D, Const<1>, <DefaultAllocator as Allocator<D>>::Buffer<f64>>
Samples from the multivariate normal distribution
§Formula
L * Z + μwhere L is the Cholesky decomposition of the covariance matrix,
Z is a vector of normally distributed random variables, and
μ is the mean vector
Source§impl<D> Distribution<Matrix<f64, D, Const<1>, <DefaultAllocator as Allocator<D>>::Buffer<f64>>> for MultivariateStudent<D>
impl<D> Distribution<Matrix<f64, D, Const<1>, <DefaultAllocator as Allocator<D>>::Buffer<f64>>> for MultivariateStudent<D>
Source§fn sample<R>(
&self,
rng: &mut R,
) -> Matrix<f64, D, Const<1>, <DefaultAllocator as Allocator<D>>::Buffer<f64>>
fn sample<R>( &self, rng: &mut R, ) -> Matrix<f64, D, Const<1>, <DefaultAllocator as Allocator<D>>::Buffer<f64>>
Samples from the multivariate student distribution
§Formula
W ⋅ L ⋅ Z + μwhere W has √(ν/Sν) distribution, Sν has Chi-squared
distribution with ν degrees of freedom,
L is the Cholesky decomposition of the scale matrix,
Z is a vector of normally distributed random variables, and
μ is the location vector