Skip to main content

Distribution

Trait Distribution 

Source
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) -> Iter<Self, R, T>
       where R: Rng,
             Self: Sized { ... }
    fn map<F, S>(self, func: F) -> Map<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 [RngExt] 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§

Source

fn sample<R>(&self, rng: &mut R) -> T
where R: Rng + ?Sized,

Generate a random value of T, using rng as the source of randomness.

Provided Methods§

Source

fn sample_iter<R>(self, rng: R) -> Iter<Self, R, T>
where R: Rng, Self: Sized,

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::distr::{Distribution, Alphanumeric, Uniform, StandardUniform};

let mut rng = rand::rng();

// Vec of 16 x f32:
let v: Vec<f32> = StandardUniform.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).unwrap();
let mut roll_die = die_range.sample_iter(&mut rng);
while roll_die.next().unwrap() != 6 {
    println!("Not a 6; rolling again!");
}
Source

fn map<F, S>(self, func: F) -> Map<Self, F, T, S>
where F: Fn(T) -> S, Self: Sized,

Map sampled values to type S

§Example
use rand::distr::{Distribution, Uniform};

let die = Uniform::new_inclusive(1, 6).unwrap();
let even_number = die.map(|num| num % 2 == 0);
while !even_number.sample(&mut rand::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".

Implementations on Foreign Types§

Source§

impl Distribution<f32> for Exp1

Source§

fn sample<R>(&self, rng: &mut R) -> f32
where R: Rng + ?Sized,

Source§

impl Distribution<f64> for Exp1

Source§

fn sample<R>(&self, rng: &mut R) -> f64
where R: Rng + ?Sized,

Source§

impl Distribution<u64> for StandardGeometric

Source§

fn sample<R>(&self, rng: &mut R) -> u64
where R: Rng + ?Sized,

Source§

impl<F> Distribution<F> for Frechet<F>

Source§

fn sample<R>(&self, rng: &mut R) -> F
where R: Rng + ?Sized,

Source§

impl<F> Distribution<F> for Gumbel<F>

Source§

fn sample<R>(&self, rng: &mut R) -> F
where R: Rng + ?Sized,

Source§

impl<F> Distribution<F> for NormalInverseGaussian<F>

Source§

fn sample<R>(&self, rng: &mut R) -> F
where R: Rng + ?Sized,

Source§

impl<F> Distribution<F> for SkewNormal<F>

Source§

fn sample<R>(&self, rng: &mut R) -> F
where R: Rng + ?Sized,

Source§

impl<T, D> Distribution<T> for &D
where D: Distribution<T> + ?Sized,

Source§

fn sample<R>(&self, rng: &mut R) -> T
where R: Rng + ?Sized,

Source§

impl<W> Distribution<usize> for WeightedAliasIndex<W>
where W: AliasableWeight,

Source§

fn sample<R>(&self, rng: &mut R) -> usize
where R: Rng + ?Sized,

Source§

impl<W> Distribution<usize> for WeightedTreeIndex<W>

Samples a randomly selected index from the weighted distribution.

Caution: This method panics if there are no elements or all weights are zero. However, it is guaranteed that this method will not panic if a call to WeightedTreeIndex::is_valid returns true.

Source§

fn sample<R>(&self, rng: &mut R) -> usize
where R: Rng + ?Sized,

Implementors§

Source§

impl Distribution<()> for rand::distr::StandardUniform

Source§

impl Distribution<NonZero<i8>> for rand::distr::StandardUniform

Source§

impl Distribution<NonZero<i16>> for rand::distr::StandardUniform

Source§

impl Distribution<NonZero<i32>> for rand::distr::StandardUniform

Source§

impl Distribution<NonZero<i64>> for rand::distr::StandardUniform

Source§

impl Distribution<NonZero<i128>> for rand::distr::StandardUniform

Source§

impl Distribution<NonZero<u8>> for rand::distr::StandardUniform

Source§

impl Distribution<NonZero<u16>> for rand::distr::StandardUniform

Source§

impl Distribution<NonZero<u32>> for rand::distr::StandardUniform

Source§

impl Distribution<NonZero<u64>> for rand::distr::StandardUniform

Source§

impl Distribution<NonZero<u128>> for rand::distr::StandardUniform

Source§

impl Distribution<Vec<f64>> for UnifiedDirichlet

Source§

impl Distribution<__m128i> for rand::distr::StandardUniform

Available on x86 or x86-64 only.
Source§

impl Distribution<__m256i> for rand::distr::StandardUniform

Available on x86 or x86-64 only.
Source§

impl Distribution<bool> for Bernoulli

Source§

impl Distribution<bool> for rand::distr::StandardUniform

Source§

impl Distribution<char> for rand::distr::StandardUniform

Source§

impl Distribution<f32> for Open01

Source§

impl Distribution<f32> for OpenClosed01

Source§

impl Distribution<f32> for scirs2_core::random::StandardNormal

Source§

impl Distribution<f32> for scirs2_core::ndarray_ext::random::StandardNormal

Source§

impl Distribution<f32> for rand::distr::StandardUniform

Source§

impl Distribution<f32> for scirs2_core::ndarray_ext::random::StandardUniform

Source§

impl Distribution<f64> for Open01

Source§

impl Distribution<f64> for OpenClosed01

Source§

impl Distribution<f64> for scirs2_core::random::StandardNormal

Source§

impl Distribution<f64> for scirs2_core::ndarray_ext::random::StandardNormal

Source§

impl Distribution<f64> for scirs2_core::random::scientific::StandardNormal

Source§

impl Distribution<f64> for rand::distr::StandardUniform

Source§

impl Distribution<f64> for scirs2_core::ndarray_ext::random::StandardUniform

Source§

impl Distribution<f64> for scirs2_core::random::scientific::StandardUniform

Source§

impl Distribution<f64> for UnifiedBeta

Source§

impl Distribution<f64> for UnifiedCauchy

Source§

impl Distribution<f64> for UnifiedChiSquared

Source§

impl Distribution<f64> for UnifiedExp

Source§

impl Distribution<f64> for UnifiedFisherF

Source§

impl Distribution<f64> for UnifiedGamma

Source§

impl Distribution<f64> for UnifiedLogNormal

Source§

impl Distribution<f64> for UnifiedNormal

Source§

impl Distribution<f64> for UnifiedPoisson

Source§

impl Distribution<f64> for UnifiedStudentT

Source§

impl Distribution<f64> for UnifiedWeibull

Source§

impl Distribution<i8> for rand::distr::StandardUniform

Source§

impl Distribution<i16> for rand::distr::StandardUniform

Source§

impl Distribution<i32> for rand::distr::StandardUniform

Source§

impl Distribution<i64> for rand::distr::StandardUniform

Source§

impl Distribution<i128> for rand::distr::StandardUniform

Source§

impl Distribution<u8> for Alphabetic

Source§

impl Distribution<u8> for Alphanumeric

Source§

impl Distribution<u8> for rand::distr::StandardUniform

Source§

impl Distribution<u16> for rand::distr::StandardUniform

Source§

impl Distribution<u32> for rand::distr::StandardUniform

Source§

impl Distribution<u64> for Binomial

Source§

impl Distribution<u64> for Geometric

Source§

impl Distribution<u64> for Hypergeometric

Source§

impl Distribution<u64> for rand::distr::StandardUniform

Source§

impl Distribution<u64> for UnifiedBinomial

Source§

impl Distribution<u128> for rand::distr::StandardUniform

Source§

impl<'a, T> Distribution<&'a T> for Choose<'a, T>

Source§

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 rand::distr::StandardUniform

Source§

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 rand::distr::StandardUniform

Source§

impl<A, B, C, D, E, F, G, H, I, J> Distribution<(A, B, C, D, E, F, G, H, I, J)> for rand::distr::StandardUniform

Source§

impl<A, B, C, D, E, F, G, H, I> Distribution<(A, B, C, D, E, F, G, H, I)> for rand::distr::StandardUniform

Source§

impl<A, B, C, D, E, F, G, H> Distribution<(A, B, C, D, E, F, G, H)> for rand::distr::StandardUniform

Source§

impl<A, B, C, D, E, F, G> Distribution<(A, B, C, D, E, F, G)> for rand::distr::StandardUniform

Source§

impl<A, B, C, D, E, F> Distribution<(A, B, C, D, E, F)> for rand::distr::StandardUniform

Source§

impl<A, B, C, D, E> Distribution<(A, B, C, D, E)> for rand::distr::StandardUniform

Source§

impl<A, B, C, D> Distribution<(A, B, C, D)> for rand::distr::StandardUniform

Source§

impl<A, B, C> Distribution<(A, B, C)> for rand::distr::StandardUniform

Source§

impl<A, B> Distribution<(A, B)> for rand::distr::StandardUniform

Source§

impl<A> Distribution<(A,)> for rand::distr::StandardUniform

Source§

impl<D, F, T, S> Distribution<S> for Map<D, F, T, S>
where D: Distribution<T>, F: Fn(T) -> S,

Source§

impl<F> Distribution<F> for Beta<F>
where F: Float, Open01: Distribution<F>,

Source§

impl<F> Distribution<F> for Cauchy<F>

Source§

impl<F> Distribution<F> for ChiSquared<F>

Source§

impl<F> Distribution<F> for Exp<F>
where F: Float, Exp1: Distribution<F>,

Source§

impl<F> Distribution<F> for FisherF<F>

Source§

impl<F> Distribution<F> for Gamma<F>

Source§

impl<F> Distribution<F> for InverseGaussian<F>

Source§

impl<F> Distribution<F> for LogNormal<F>

Source§

impl<F> Distribution<F> for Normal<F>

Source§

impl<F> Distribution<F> for Pareto<F>

Source§

impl<F> Distribution<F> for Pert<F>

Source§

impl<F> Distribution<F> for Poisson<F>

Source§

impl<F> Distribution<F> for StudentT<F>

Source§

impl<F> Distribution<F> for Triangular<F>

Source§

impl<F> Distribution<F> for Weibull<F>

Source§

impl<F> Distribution<F> for Zeta<F>

Source§

impl<F> Distribution<F> for Zipf<F>

Source§

impl<F> Distribution<Vec<F>> for Dirichlet<F>

Source§

impl<F> Distribution<[F; 2]> for UnitCircle
where F: Float + SampleUniform,

Source§

impl<F> Distribution<[F; 2]> for UnitDisc
where F: Float + SampleUniform,

Source§

impl<F> Distribution<[F; 3]> for UnitBall
where F: Float + SampleUniform,

Source§

impl<F> Distribution<[F; 3]> for UnitSphere
where F: Float + SampleUniform,

Source§

impl<T, const N: usize> Distribution<[T; N]> for rand::distr::StandardUniform

Source§

impl<T> Distribution<Wrapping<T>> for rand::distr::StandardUniform

Source§

impl<X> Distribution<X> for Uniform<X>
where X: SampleUniform,

Source§

impl<X> Distribution<usize> for WeightedIndex<X>