Skip to main content

dashu_cmplx/third_party/
rand_v08.rs

1//! `rand` 0.8 `Distribution` impls for `CBig` (the `rand` feature aliases `rand_v08`).
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_v08::distributions::{Open01, OpenClosed01, Standard};
9use rand_v08::prelude::Distribution;
10use rand_v08::Rng;
11
12fn bridge<R: Rng + ?Sized>(rng: &mut R) -> impl dashu_int::rand::BitRng + '_ {
13    dashu_int::rand::bridge_v08(rng)
14}
15
16impl<R: Round, const B: Word> Distribution<CBig<R, B>> for UniformCBig<R, B> {
17    #[inline]
18    fn sample<RNG: Rng + ?Sized>(&self, rng: &mut RNG) -> CBig<R, B> {
19        self.sample_cbig(&mut bridge(rng))
20    }
21}
22
23impl<R: Round, const B: Word> Distribution<CBig<R, B>> for Standard {
24    /// Each part uniform in `[0, 1)` → the unit square `[0, 1)²`, at inline precision.
25    #[inline]
26    fn sample<RNG: Rng + ?Sized>(&self, rng: &mut RNG) -> CBig<R, B> {
27        let re: FBig<R, B> = Standard.sample(rng);
28        let im: FBig<R, B> = Standard.sample(rng);
29        CBig::from_parts(re, im)
30    }
31}
32
33impl<R: Round, const B: Word> Distribution<CBig<R, B>> for Open01 {
34    #[inline]
35    fn sample<RNG: Rng + ?Sized>(&self, rng: &mut RNG) -> CBig<R, B> {
36        let re: FBig<R, B> = Open01.sample(rng);
37        let im: FBig<R, B> = Open01.sample(rng);
38        CBig::from_parts(re, im)
39    }
40}
41
42impl<R: Round, const B: Word> Distribution<CBig<R, B>> for OpenClosed01 {
43    #[inline]
44    fn sample<RNG: Rng + ?Sized>(&self, rng: &mut RNG) -> CBig<R, B> {
45        let re: FBig<R, B> = OpenClosed01.sample(rng);
46        let im: FBig<R, B> = OpenClosed01.sample(rng);
47        CBig::from_parts(re, im)
48    }
49}