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 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§

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", so this trait is not object safe.

Implementations on Foreign Types§

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,

Implementors§

Source§

impl Distribution<bool> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<bool> for Bernoulli

Source§

impl Distribution<char> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<f32> for Exp1

Source§

impl Distribution<f32> for scirs2_core::ndarray::distributions::StandardUniform

Source§

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

Source§

impl Distribution<f32> for scirs2_core::ndarray_ext::random::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<f64> for Exp1

Source§

impl Distribution<f64> for scirs2_core::ndarray::distributions::StandardUniform

Source§

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

Source§

impl Distribution<f64> for scirs2_core::ndarray_ext::random::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<f64> for scirs2_core::random::scientific::StandardNormal

Source§

impl Distribution<f64> for scirs2_core::random::scientific::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<i8> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<i16> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<i32> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<i64> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<i128> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<u8> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<u8> for Alphabetic

Source§

impl Distribution<u8> for Alphanumeric

Source§

impl Distribution<u16> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<u32> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<u64> for StandardGeometric

Source§

impl Distribution<u64> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<u64> for UnifiedBinomial

Source§

impl Distribution<u64> for Binomial

Source§

impl Distribution<u64> for Geometric

Source§

impl Distribution<u64> for Hypergeometric

Source§

impl Distribution<u128> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<()> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<Vec<f64>> for UnifiedDirichlet

Source§

impl Distribution<__m128i> for scirs2_core::ndarray::distributions::StandardUniform

Available on x86 or x86-64 only.
Source§

impl Distribution<__m256i> for scirs2_core::ndarray::distributions::StandardUniform

Available on x86 or x86-64 only.
Source§

impl Distribution<NonZero<i8>> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<NonZero<i16>> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<NonZero<i32>> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<NonZero<i64>> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<NonZero<i128>> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<NonZero<u8>> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<NonZero<u16>> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<NonZero<u32>> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<NonZero<u64>> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl Distribution<NonZero<u128>> for scirs2_core::ndarray::distributions::StandardUniform

Source§

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

Source§

impl<A> Distribution<(A,)> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl<A, B> Distribution<(A, B)> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl<A, B, C> Distribution<(A, B, C)> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl<A, B, C, D> Distribution<(A, B, C, D)> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl<A, B, C, D, E> Distribution<(A, B, C, D, E)> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl<A, B, C, D, E, F> Distribution<(A, B, C, D, E, F)> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl<A, B, C, D, E, F, G> Distribution<(A, B, C, D, E, F, G)> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl<A, B, C, D, E, F, G, H> Distribution<(A, B, C, D, E, F, G, H)> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl<A, B, C, D, E, F, G, H, I> Distribution<(A, B, C, D, E, F, G, H, I)> for scirs2_core::ndarray::distributions::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 scirs2_core::ndarray::distributions::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 scirs2_core::ndarray::distributions::StandardUniform

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 scirs2_core::ndarray::distributions::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; 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<F> Distribution<F> for Frechet<F>

Source§

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

Source§

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

Source§

impl<F> Distribution<F> for SkewNormal<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 InverseGaussian<F>

Source§

impl<F> Distribution<F> for LogNormal<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 Beta<F>
where F: Float, Open01: Distribution<F>,

Source§

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

Source§

impl<F> Distribution<F> for Normal<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, const N: usize> Distribution<[F; N]> for Dirichlet<F, N>

Source§

impl<T> Distribution<Wrapping<T>> for scirs2_core::ndarray::distributions::StandardUniform

Source§

impl<T, const N: usize> Distribution<[T; N]> for scirs2_core::ndarray::distributions::StandardUniform

Source§

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

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§

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

Source§

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