dashu_cmplx/third_party/
rand_v09.rs1use crate::cbig::CBig;
4use crate::third_party::rand::UniformCBig;
5use dashu_float::round::Round;
6use dashu_float::FBig;
7use dashu_int::Word;
8use rand_v09::distr::{Distribution, Open01, OpenClosed01, StandardUniform};
9use rand_v09::Rng;
10
11fn bridge<R: Rng + ?Sized>(rng: &mut R) -> impl dashu_int::rand::BitRng + '_ {
12 dashu_int::rand::bridge_v09(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 #[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}