# [−][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 |

## Constants

STANDARD_MULTI_NORMAL | The multivariate standard normal distribution. |