From d5ae4a0c828af8a89085c35f59699201830d5fae Mon Sep 17 00:00:00 2001 From: Quentin Kniep Date: Sat, 18 Apr 2026 15:51:45 +0200 Subject: [PATCH] update rand `0.9` -> `0.10` --- Cargo.toml | 4 ++-- src/distribution/bernoulli.rs | 4 ++-- src/distribution/binomial.rs | 4 ++-- src/distribution/categorical.rs | 2 +- src/distribution/cauchy.rs | 3 ++- src/distribution/discrete_uniform.rs | 4 ++-- src/distribution/gamma.rs | 4 ++-- src/distribution/geometric.rs | 3 +++ src/distribution/gumbel.rs | 3 ++- src/distribution/hypergeometric.rs | 4 ++-- src/distribution/laplace.rs | 7 +++++-- src/distribution/levy.rs | 2 +- src/distribution/multivariate_normal.rs | 3 ++- src/distribution/multivariate_students_t.rs | 2 +- src/distribution/negative_binomial.rs | 2 +- src/distribution/pareto.rs | 2 +- src/distribution/poisson.rs | 2 ++ src/distribution/triangular.rs | 2 +- src/distribution/uniform.rs | 2 +- src/distribution/weibull.rs | 2 +- src/distribution/ziggurat.rs | 2 +- 21 files changed, 37 insertions(+), 26 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index cd3125e0..595ed0c2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,14 +29,14 @@ default = ["std", "nalgebra", "rand"] std = ["nalgebra?/std", "rand?/std"] # at the moment, all nalgebra features needs std nalgebra = ["dep:nalgebra", "std"] -rand = ["dep:rand", "nalgebra?/rand"] +rand = ["dep:rand", "nalgebra?/rand", "rand?/std_rng"] [dependencies] approx = "0.5.0" num-traits = "0.2.14" [dependencies.rand] -version = "0.9.0" +version = "0.10.0" optional = true default-features = false diff --git a/src/distribution/bernoulli.rs b/src/distribution/bernoulli.rs index a04ee25b..bba5d19e 100644 --- a/src/distribution/bernoulli.rs +++ b/src/distribution/bernoulli.rs @@ -88,7 +88,7 @@ impl core::fmt::Display for Bernoulli { #[cfg_attr(docsrs, doc(cfg(feature = "rand")))] impl ::rand::distr::Distribution for Bernoulli { fn sample(&self, rng: &mut R) -> bool { - rng.random_bool(self.p()) + ::rand::RngExt::random_bool(rng, self.p()) } } @@ -96,7 +96,7 @@ impl ::rand::distr::Distribution for Bernoulli { #[cfg_attr(docsrs, doc(cfg(feature = "rand")))] impl ::rand::distr::Distribution for Bernoulli { fn sample(&self, rng: &mut R) -> f64 { - rng.sample::(self) as u8 as f64 + ::rand::RngExt::sample::(rng, self) as u8 as f64 } } diff --git a/src/distribution/binomial.rs b/src/distribution/binomial.rs index f4eec3b5..130148a0 100644 --- a/src/distribution/binomial.rs +++ b/src/distribution/binomial.rs @@ -116,7 +116,7 @@ impl core::fmt::Display for Binomial { impl ::rand::distr::Distribution for Binomial { fn sample(&self, rng: &mut R) -> u64 { (0..self.n).fold(0, |acc, _| { - let n: f64 = rng.random(); + let n: f64 = ::rand::RngExt::random(rng); if n < self.p { acc + 1 } else { acc } }) } @@ -126,7 +126,7 @@ impl ::rand::distr::Distribution for Binomial { #[cfg_attr(docsrs, doc(cfg(feature = "rand")))] impl ::rand::distr::Distribution for Binomial { fn sample(&self, rng: &mut R) -> f64 { - rng.sample::(self) as f64 + ::rand::RngExt::sample::(rng, self) as f64 } } diff --git a/src/distribution/categorical.rs b/src/distribution/categorical.rs index bb06aa1e..ff56dea7 100644 --- a/src/distribution/categorical.rs +++ b/src/distribution/categorical.rs @@ -344,7 +344,7 @@ impl Discrete for Categorical { #[cfg(feature = "rand")] #[cfg_attr(docsrs, doc(cfg(feature = "rand")))] pub fn sample_unchecked(rng: &mut R, cdf: &[f64]) -> usize { - let draw = rng.random::() * cdf.last().unwrap(); + let draw = ::rand::RngExt::random::(rng) * cdf.last().unwrap(); cdf.iter().position(|val| *val >= draw).unwrap() } diff --git a/src/distribution/cauchy.rs b/src/distribution/cauchy.rs index cf3c7f3b..2c02b883 100644 --- a/src/distribution/cauchy.rs +++ b/src/distribution/cauchy.rs @@ -115,7 +115,8 @@ impl core::fmt::Display for Cauchy { #[cfg_attr(docsrs, doc(cfg(feature = "rand")))] impl ::rand::distr::Distribution for Cauchy { fn sample(&self, r: &mut R) -> f64 { - self.location + self.scale * (f64::consts::PI * (r.random::() - 0.5)).tan() + let x = ::rand::RngExt::random::(r); + self.location + self.scale * (f64::consts::PI * (x - 0.5)).tan() } } diff --git a/src/distribution/discrete_uniform.rs b/src/distribution/discrete_uniform.rs index 21d14bed..b4521473 100644 --- a/src/distribution/discrete_uniform.rs +++ b/src/distribution/discrete_uniform.rs @@ -117,7 +117,7 @@ impl core::fmt::Display for DiscreteUniform { #[cfg_attr(docsrs, doc(cfg(feature = "rand")))] impl ::rand::distr::Distribution for DiscreteUniform { fn sample(&self, rng: &mut R) -> i64 { - rng.random_range(self.min..=self.max) + ::rand::RngExt::random_range(rng, self.min..=self.max) } } @@ -125,7 +125,7 @@ impl ::rand::distr::Distribution for DiscreteUniform { #[cfg_attr(docsrs, doc(cfg(feature = "rand")))] impl ::rand::distr::Distribution for DiscreteUniform { fn sample(&self, rng: &mut R) -> f64 { - rng.sample::(self) as f64 + ::rand::RngExt::sample::(rng, self) as f64 } } diff --git a/src/distribution/gamma.rs b/src/distribution/gamma.rs index 341e3122..6686b200 100644 --- a/src/distribution/gamma.rs +++ b/src/distribution/gamma.rs @@ -410,7 +410,7 @@ pub fn sample_unchecked(rng: &mut R, shape: f64, rate: let mut afix = 1.0; if shape < 1.0 { a = shape + 1.0; - afix = rng.random::().powf(1.0 / shape); + afix = ::rand::RngExt::random::(rng).powf(1.0 / shape); } let d = a - 1.0 / 3.0; @@ -428,7 +428,7 @@ pub fn sample_unchecked(rng: &mut R, shape: f64, rate: v = v * v * v; x = x * x; - let u: f64 = rng.random(); + let u: f64 = ::rand::RngExt::random(rng); if u < 1.0 - 0.0331 * x * x || u.ln() < 0.5 * x + d * (1.0 - v + v.ln()) { return afix * d * v / rate; } diff --git a/src/distribution/geometric.rs b/src/distribution/geometric.rs index e794fdf9..f61233f9 100644 --- a/src/distribution/geometric.rs +++ b/src/distribution/geometric.rs @@ -3,6 +3,9 @@ use crate::prec; use crate::statistics::*; use core::f64; +#[cfg(feature = "rand")] +use rand::RngExt; + /// Implements the /// [Geometric](https://en.wikipedia.org/wiki/Geometric_distribution) /// distribution diff --git a/src/distribution/gumbel.rs b/src/distribution/gumbel.rs index 7a3dc43b..b9df7cfe 100644 --- a/src/distribution/gumbel.rs +++ b/src/distribution/gumbel.rs @@ -117,7 +117,8 @@ impl core::fmt::Display for Gumbel { #[cfg(feature = "rand")] impl ::rand::distr::Distribution for Gumbel { fn sample(&self, r: &mut R) -> f64 { - self.location - self.scale * ((-(r.random::())).ln()).ln() + let x = ::rand::RngExt::random::(r); + self.location - self.scale * ((-x).ln()).ln() } } diff --git a/src/distribution/hypergeometric.rs b/src/distribution/hypergeometric.rs index 3ca4d48f..b2e443f7 100644 --- a/src/distribution/hypergeometric.rs +++ b/src/distribution/hypergeometric.rs @@ -168,7 +168,7 @@ impl ::rand::distr::Distribution for Hypergeometric { let mut x = 0; loop { let p = successes / population; - let next: f64 = rng.random(); + let next: f64 = ::rand::RngExt::random(rng); if next < p { x += 1; successes -= 1.0; @@ -187,7 +187,7 @@ impl ::rand::distr::Distribution for Hypergeometric { #[cfg_attr(docsrs, doc(cfg(feature = "rand")))] impl ::rand::distr::Distribution for Hypergeometric { fn sample(&self, rng: &mut R) -> f64 { - rng.sample::(self) as f64 + ::rand::RngExt::sample::(rng, self) as f64 } } diff --git a/src/distribution/laplace.rs b/src/distribution/laplace.rs index 12c4da36..d125058b 100644 --- a/src/distribution/laplace.rs +++ b/src/distribution/laplace.rs @@ -115,7 +115,7 @@ impl core::fmt::Display for Laplace { #[cfg_attr(docsrs, doc(cfg(feature = "rand")))] impl ::rand::distr::Distribution for Laplace { fn sample(&self, rng: &mut R) -> f64 { - let x: f64 = rng.random_range(-0.5..0.5); + let x: f64 = ::rand::RngExt::random_range(rng, -0.5..0.5); self.location - self.scale * x.signum() * (1. - 2. * x.abs()).ln() } } @@ -550,9 +550,12 @@ mod tests { #[test] fn test_sample() { use ::rand::distr::Distribution; + use ::rand::rngs::StdRng; + use ::rand::SeedableRng; let l = create_ok(0.1, 0.5); - l.sample(&mut ::rand::rng()); + let mut rng = StdRng::seed_from_u64(42); + l.sample(&mut rng); } #[cfg(feature = "rand")] diff --git a/src/distribution/levy.rs b/src/distribution/levy.rs index 967c861f..52bf5f65 100644 --- a/src/distribution/levy.rs +++ b/src/distribution/levy.rs @@ -114,7 +114,7 @@ impl ::rand::distr::Distribution for Levy { use rand::distr::OpenClosed01; // Inverse transform sampling - let u: f64 = rng.sample(OpenClosed01); + let u: f64 = ::rand::RngExt::sample(rng, OpenClosed01); self.mu + (0.5 * self.c) / erfc_inv(u).powf(2.0) } } diff --git a/src/distribution/multivariate_normal.rs b/src/distribution/multivariate_normal.rs index 77be577b..417245b9 100644 --- a/src/distribution/multivariate_normal.rs +++ b/src/distribution/multivariate_normal.rs @@ -414,7 +414,8 @@ where /// `μ` is the mean vector fn sample(&self, rng: &mut R) -> OVector { let d = crate::distribution::Normal::new(0., 1.).unwrap(); - let z = OVector::from_distribution_generic(self.mu.shape_generic().0, Const::<1>, &d, rng); + let z = + OVector::from_fn_generic(self.mu.shape_generic().0, Const::<1>, |_, _| d.sample(rng)); (&self.cov_chol_decomp * z) + &self.mu } } diff --git a/src/distribution/multivariate_students_t.rs b/src/distribution/multivariate_students_t.rs index 6b952f40..949c25ea 100644 --- a/src/distribution/multivariate_students_t.rs +++ b/src/distribution/multivariate_students_t.rs @@ -225,7 +225,7 @@ where let s = ChiSquared::new(self.freedom).unwrap(); let w = (self.freedom / s.sample(rng)).sqrt(); let (r, c) = self.location.shape_generic(); - let z = OVector::::from_distribution_generic(r, c, &d, rng); + let z = OVector::::from_fn_generic(r, c, |_, _| d.sample(rng)); (w * &self.scale_chol_decomp * z) + &self.location } } diff --git a/src/distribution/negative_binomial.rs b/src/distribution/negative_binomial.rs index 3e15ff48..39948f8e 100644 --- a/src/distribution/negative_binomial.rs +++ b/src/distribution/negative_binomial.rs @@ -493,7 +493,7 @@ mod tests { #[cfg(all(feature = "rand", feature = "std"))] fn test_sample() { use crate::prec; - use rand::{distr::Distribution, SeedableRng, rngs::StdRng}; + use rand::{distr::Distribution, rngs::StdRng, SeedableRng}; let dist = NegativeBinomial::new(4.0, 0.5).unwrap(); let mut rng = StdRng::seed_from_u64(1600); diff --git a/src/distribution/pareto.rs b/src/distribution/pareto.rs index f426bb73..5b60074b 100644 --- a/src/distribution/pareto.rs +++ b/src/distribution/pareto.rs @@ -120,7 +120,7 @@ impl ::rand::distr::Distribution for Pareto { use rand::distr::OpenClosed01; // Inverse transform sampling - let u: f64 = rng.sample(OpenClosed01); + let u: f64 = ::rand::RngExt::sample(rng, OpenClosed01); self.scale * u.powf(-1.0 / self.shape) } } diff --git a/src/distribution/poisson.rs b/src/distribution/poisson.rs index 78e06da2..316b6825 100644 --- a/src/distribution/poisson.rs +++ b/src/distribution/poisson.rs @@ -302,6 +302,8 @@ impl Discrete for Poisson { #[cfg(feature = "rand")] #[cfg_attr(docsrs, doc(cfg(feature = "rand")))] pub fn sample_unchecked(rng: &mut R, lambda: f64) -> f64 { + use rand::RngExt; + if lambda < 30.0 { let limit = (-lambda).exp(); let mut count = 0.0; diff --git a/src/distribution/triangular.rs b/src/distribution/triangular.rs index c8954901..513b4f38 100644 --- a/src/distribution/triangular.rs +++ b/src/distribution/triangular.rs @@ -425,7 +425,7 @@ impl Continuous for Triangular { #[cfg(feature = "rand")] #[cfg_attr(docsrs, doc(cfg(feature = "rand")))] fn sample_unchecked(rng: &mut R, min: f64, max: f64, mode: f64) -> f64 { - let f: f64 = rng.random(); + let f: f64 = ::rand::RngExt::random(rng); if f < (mode - min) / (max - min) { min + (f * (max - min) * (mode - min)).sqrt() } else { diff --git a/src/distribution/uniform.rs b/src/distribution/uniform.rs index bdb87444..bda5b348 100644 --- a/src/distribution/uniform.rs +++ b/src/distribution/uniform.rs @@ -154,7 +154,7 @@ impl core::fmt::Display for Uniform { impl ::rand::distr::Distribution for Uniform { fn sample(&self, rng: &mut R) -> f64 { let d = rand::distr::Uniform::new_inclusive(self.min, self.max).unwrap(); - rng.sample(d) + ::rand::RngExt::sample(rng, d) } } diff --git a/src/distribution/weibull.rs b/src/distribution/weibull.rs index d3cc8748..b9d9507e 100644 --- a/src/distribution/weibull.rs +++ b/src/distribution/weibull.rs @@ -126,7 +126,7 @@ impl core::fmt::Display for Weibull { #[cfg_attr(docsrs, doc(cfg(feature = "rand")))] impl ::rand::distr::Distribution for Weibull { fn sample(&self, rng: &mut R) -> f64 { - let x: f64 = rng.random(); + let x: f64 = ::rand::RngExt::random(rng); self.scale * (-x.ln()).powf(1.0 / self.shape) } } diff --git a/src/distribution/ziggurat.rs b/src/distribution/ziggurat.rs index 589e23ab..ffbe6196 100644 --- a/src/distribution/ziggurat.rs +++ b/src/distribution/ziggurat.rs @@ -1,6 +1,6 @@ use super::ziggurat_tables; -use rand::Rng; use rand::distr::Open01; +use rand::{Rng, RngExt}; pub fn sample_std_normal(rng: &mut R) -> f64 { #[inline]