use crate::id::Id;
use rand_distr::uniform::{SampleRange, SampleUniform};
use rand_distr::{Distribution, StandardNormal, StandardUniform};
impl<T> Id<T> {
pub fn random() -> Self
where
StandardUniform: Distribution<T>,
{
use rand::Rng;
let mut rng = rand::rng();
Self::new(rng.random())
}
pub fn random_between<R>(range: R) -> Self
where
R: SampleRange<T>,
T: SampleUniform,
{
Self::new(rand::random_range(range))
}
pub fn random_with<R, Dist>(rng: &mut R, distr: Dist) -> Self
where
R: ?Sized + rand::RngCore,
Dist: Distribution<T>,
{
use rand::Rng;
let rid = rng.sample(distr);
Self::new(rid)
}
}
impl<T> Distribution<Id<T>> for StandardNormal
where
StandardNormal: Distribution<T>,
{
fn sample<R: rand::Rng + ?Sized>(&self, rng: &mut R) -> Id<T> {
Id::new(rng.sample(StandardNormal))
}
}
impl<T> Distribution<Id<T>> for StandardUniform
where
StandardUniform: Distribution<T>,
{
fn sample<R: rand::Rng + ?Sized>(&self, rng: &mut R) -> Id<T> {
Id::new(rng.sample(StandardUniform))
}
}