use crate::octave::Octave;
use rand::{Rng, RngExt};
use rand_distr::uniform::{SampleRange, SampleUniform};
use rand_distr::{Distribution, StandardNormal, StandardUniform};
impl<T> Octave<T> {
pub fn random() -> Self
where
StandardUniform: Distribution<T>,
{
Octave(rand::random())
}
pub fn random_in<R>(rng: &mut R) -> Self
where
R: ?Sized + Rng,
StandardUniform: Distribution<T>,
{
Octave(rng.random())
}
pub fn random_with<R, Distr>(rng: &mut R, distr: Distr) -> Self
where
R: ?Sized + Rng,
Distr: Distribution<T>,
{
Octave(rng.sample(distr))
}
pub fn random_range<R>(range: R) -> Self
where
R: SampleRange<T>,
T: SampleUniform,
{
Self(rand::random_range(range))
}
}
impl<T> Distribution<Octave<T>> for StandardUniform
where
StandardUniform: Distribution<T>,
{
fn sample<R: rand::Rng + ?Sized>(&self, rng: &mut R) -> Octave<T> {
Octave::random_with(rng, StandardUniform)
}
}
impl<T> Distribution<Octave<T>> for StandardNormal
where
StandardNormal: Distribution<T>,
{
fn sample<R: rand::Rng + ?Sized>(&self, rng: &mut R) -> Octave<T> {
Octave::random_with(rng, StandardNormal)
}
}