[][src]Crate rand_array_iid

This crates exposes a single struct, IIDDistr, parametrized by a Distribution D.

If D is a Distribution<T> (meaning that it can be used to sample random variate of type T) then IIDDistr<D> is a Distribution<[T;n]> for n between 0 and 31 included (by default), and up to 512 included if the feature more_array_sizes is activated. IIDDistr<D> can be used to sample arrays whose elements are Independently Identically Distributed (i.i.d.) according to D.

Handling of panic

If sampling from the underlying distributon D panics, sampling from IIDDistr<D> panics as well, but no memory is leaked. This guarantee actually comes from the array_init crate.

Examples

An array of normally distributed scalars

let distr = IIDDistr::new(StandardNormal);
let mut rng = rand::thread_rng();
// Each of x element is distributed according to StandardNormal.
let x : [f64; 10] = distr.sample(&mut rng);

An array of 3D vectors sampled from the unit sphere

let distr = IIDDistr::new(UnitSphere);
let mut rng = rand::thread_rng();
// Each of x element is sampled uniformly from the surface of the 3D unit sphere.
let x : [[f64; 3]; 10] = distr.sample(&mut rng);

Why only arrays?

Collections such as [Vec] that implement [std::iter::FromIterator] bear no information on their size in their type, hence the distribution would have to be restricted to a given size. They can also be sampled as follow:

fn sample_iid<D,R, Col>(dist: D, rng: &mut R, n: usize) -> Col
where
    R: Rng + ?Sized,
    Col: std::iter::IntoIterator,
    Col: std::iter::FromIterator<<Col as std::iter::IntoIterator>::Item>,
    D: Distribution<<Col as std::iter::IntoIterator>::Item>,
{
    dist.sample_iter(rng).take(n).collect()
}

Structs

IIDDistr

A distribution on arrays whose elements are i.i.d. with distribution D.

Constants

STANDARD_MULTI_NORMAL

The multivariate standard normal distribution.