Skip to main content

dashu_cmplx/third_party/
rand_v010.rs

1//! `rand` 0.10 `Distribution` impls for `CBig` (enable the `rand_v010` feature).
2
3use crate::cbig::CBig;
4use crate::third_party::rand::UniformCBig;
5use dashu_float::round::Round;
6use dashu_float::FBig;
7use dashu_int::Word;
8use rand_v010::distr::{Distribution, Open01, OpenClosed01, StandardUniform};
9use rand_v010::Rng;
10
11fn bridge<R: Rng + ?Sized>(rng: &mut R) -> impl dashu_int::rand::BitRng + '_ {
12    dashu_int::rand::bridge_v010(rng)
13}
14
15impl<R: Round, const B: Word> Distribution<CBig<R, B>> for UniformCBig<R, B> {
16    #[inline]
17    fn sample<RNG: Rng + ?Sized>(&self, rng: &mut RNG) -> CBig<R, B> {
18        self.sample_cbig(&mut bridge(rng))
19    }
20}
21
22impl<R: Round, const B: Word> Distribution<CBig<R, B>> for StandardUniform {
23    /// Each part uniform in `[0, 1)` → the unit square `[0, 1)²`, at inline precision.
24    #[inline]
25    fn sample<RNG: Rng + ?Sized>(&self, rng: &mut RNG) -> CBig<R, B> {
26        let re: FBig<R, B> = StandardUniform.sample(rng);
27        let im: FBig<R, B> = StandardUniform.sample(rng);
28        CBig::from_parts(re, im)
29    }
30}
31
32impl<R: Round, const B: Word> Distribution<CBig<R, B>> for Open01 {
33    #[inline]
34    fn sample<RNG: Rng + ?Sized>(&self, rng: &mut RNG) -> CBig<R, B> {
35        let re: FBig<R, B> = Open01.sample(rng);
36        let im: FBig<R, B> = Open01.sample(rng);
37        CBig::from_parts(re, im)
38    }
39}
40
41impl<R: Round, const B: Word> Distribution<CBig<R, B>> for OpenClosed01 {
42    #[inline]
43    fn sample<RNG: Rng + ?Sized>(&self, rng: &mut RNG) -> CBig<R, B> {
44        let re: FBig<R, B> = OpenClosed01.sample(rng);
45        let im: FBig<R, B> = OpenClosed01.sample(rng);
46        CBig::from_parts(re, im)
47    }
48}