From e646ed64e90cd3023332bdf9a61937ec2b7fb6ba Mon Sep 17 00:00:00 2001 From: Diggory Hardy Date: Wed, 4 Feb 2026 12:01:39 +0000 Subject: [PATCH 1/4] Add fn rand::make_rng --- src/lib.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index eb7cd8459b..ffee07c770 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -90,6 +90,34 @@ pub use rng::{Fill, RngExt}; #[cfg(feature = "thread_rng")] use crate::distr::{Distribution, StandardUniform}; +/// Construct and seed an RNG +/// +/// This method yields a seeded RNG, using [`rng`] ([`ThreadRng`]) if enabled or +/// [`SysRng`] otherwise. +/// +/// # Examples +/// +/// ``` +/// let mut rng: rand::rngs::SmallRng = rand::make_rng(); +/// # let _ = rand::Rng::next_u32(&mut rng); +/// ``` +/// +/// # Security +/// +/// Refer to [`ThreadRng#Security`]. +#[cfg(feature = "sys_rng")] +pub fn make_rng() -> R { + #[cfg(feature = "thread_rng")] + { + R::from_rng(&mut rng()) + } + + #[cfg(not(feature = "thread_rng"))] + { + R::try_from_rng(&mut rngs::SysRng).expect("unexpected failure from SysRng") + } +} + /// Adapter to support [`std::io::Read`] over a [`TryRng`] /// /// # Examples From 1fa3f14c06ae1fbd00f3d93f3218358de1c4c643 Mon Sep 17 00:00:00 2001 From: Diggory Hardy Date: Wed, 4 Feb 2026 12:14:50 +0000 Subject: [PATCH 2/4] Use make_rng --- benches/benches/array.rs | 16 ++++----- benches/benches/bool.rs | 14 ++++---- benches/benches/generators.rs | 60 ++++++++++++++++---------------- benches/benches/seq_choose.rs | 10 +++--- benches/benches/shuffle.rs | 2 +- benches/benches/simd.rs | 18 +++++----- benches/benches/standard.rs | 2 +- benches/benches/uniform.rs | 4 +-- benches/benches/uniform_float.rs | 4 +-- benches/benches/weighted.rs | 2 +- src/prelude.rs | 2 +- src/rngs/small.rs | 7 ++-- src/rngs/std.rs | 9 ++--- 13 files changed, 75 insertions(+), 75 deletions(-) diff --git a/benches/benches/array.rs b/benches/benches/array.rs index 2a4baf2086..862fcec95f 100644 --- a/benches/benches/array.rs +++ b/benches/benches/array.rs @@ -26,7 +26,7 @@ pub fn bench(c: &mut Criterion) { g.bench_function("u16_iter_repeat", |b| { use core::iter; - let mut rng = Pcg64Mcg::from_rng(&mut rand::rng()); + let mut rng: Pcg64Mcg = rand::make_rng(); b.iter(|| { let v: Vec = iter::repeat(()).map(|()| rng.random()).take(512).collect(); v @@ -34,7 +34,7 @@ pub fn bench(c: &mut Criterion) { }); g.bench_function("u16_sample_iter", |b| { - let mut rng = Pcg64Mcg::from_rng(&mut rand::rng()); + let mut rng: Pcg64Mcg = rand::make_rng(); b.iter(|| { let v: Vec = StandardUniform.sample_iter(&mut rng).take(512).collect(); v @@ -42,7 +42,7 @@ pub fn bench(c: &mut Criterion) { }); g.bench_function("u16_gen_array", |b| { - let mut rng = Pcg64Mcg::from_rng(&mut rand::rng()); + let mut rng: Pcg64Mcg = rand::make_rng(); b.iter(|| { let v: [u16; 512] = rng.random(); v @@ -50,7 +50,7 @@ pub fn bench(c: &mut Criterion) { }); g.bench_function("u16_fill", |b| { - let mut rng = Pcg64Mcg::from_rng(&mut rand::rng()); + let mut rng: Pcg64Mcg = rand::make_rng(); let mut buf = [0u16; 512]; b.iter(|| { rng.fill(&mut buf[..]); @@ -60,7 +60,7 @@ pub fn bench(c: &mut Criterion) { g.bench_function("u64_iter_repeat", |b| { use core::iter; - let mut rng = Pcg64Mcg::from_rng(&mut rand::rng()); + let mut rng: Pcg64Mcg = rand::make_rng(); b.iter(|| { let v: Vec = iter::repeat(()).map(|()| rng.random()).take(128).collect(); v @@ -68,7 +68,7 @@ pub fn bench(c: &mut Criterion) { }); g.bench_function("u64_sample_iter", |b| { - let mut rng = Pcg64Mcg::from_rng(&mut rand::rng()); + let mut rng: Pcg64Mcg = rand::make_rng(); b.iter(|| { let v: Vec = StandardUniform.sample_iter(&mut rng).take(128).collect(); v @@ -76,7 +76,7 @@ pub fn bench(c: &mut Criterion) { }); g.bench_function("u64_gen_array", |b| { - let mut rng = Pcg64Mcg::from_rng(&mut rand::rng()); + let mut rng: Pcg64Mcg = rand::make_rng(); b.iter(|| { let v: [u64; 128] = rng.random(); v @@ -84,7 +84,7 @@ pub fn bench(c: &mut Criterion) { }); g.bench_function("u64_fill", |b| { - let mut rng = Pcg64Mcg::from_rng(&mut rand::rng()); + let mut rng: Pcg64Mcg = rand::make_rng(); let mut buf = [0u64; 128]; b.iter(|| { rng.fill(&mut buf[..]); diff --git a/benches/benches/bool.rs b/benches/benches/bool.rs index 0625eea871..ff15ec59b4 100644 --- a/benches/benches/bool.rs +++ b/benches/benches/bool.rs @@ -27,41 +27,41 @@ pub fn bench(c: &mut Criterion) { g.measurement_time(core::time::Duration::from_millis(1000)); g.bench_function("standard", |b| { - let mut rng = Pcg32::from_rng(&mut rand::rng()); + let mut rng: Pcg32 = rand::make_rng(); b.iter(|| rng.sample::(rand::distr::StandardUniform)) }); g.bench_function("const", |b| { - let mut rng = Pcg32::from_rng(&mut rand::rng()); + let mut rng: Pcg32 = rand::make_rng(); b.iter(|| rng.random_bool(0.18)) }); g.bench_function("var", |b| { - let mut rng = Pcg32::from_rng(&mut rand::rng()); + let mut rng: Pcg32 = rand::make_rng(); let p = rng.random(); b.iter(|| rng.random_bool(p)) }); g.bench_function("ratio_const", |b| { - let mut rng = Pcg32::from_rng(&mut rand::rng()); + let mut rng: Pcg32 = rand::make_rng(); b.iter(|| rng.random_ratio(2, 3)) }); g.bench_function("ratio_var", |b| { - let mut rng = Pcg32::from_rng(&mut rand::rng()); + let mut rng: Pcg32 = rand::make_rng(); let d = rng.random_range(1..=100); let n = rng.random_range(0..=d); b.iter(|| rng.random_ratio(n, d)); }); g.bench_function("bernoulli_const", |b| { - let mut rng = Pcg32::from_rng(&mut rand::rng()); + let mut rng: Pcg32 = rand::make_rng(); let d = Bernoulli::new(0.18).unwrap(); b.iter(|| rng.sample(d)) }); g.bench_function("bernoulli_var", |b| { - let mut rng = Pcg32::from_rng(&mut rand::rng()); + let mut rng: Pcg32 = rand::make_rng(); let p = rng.random(); let d = Bernoulli::new(p).unwrap(); b.iter(|| rng.sample(d)) diff --git a/benches/benches/generators.rs b/benches/benches/generators.rs index 6d535d8d98..74a05abd09 100644 --- a/benches/benches/generators.rs +++ b/benches/benches/generators.rs @@ -38,15 +38,15 @@ pub fn random_bytes(c: &mut Criterion) { }); } - bench(&mut g, "pcg32", Pcg32::from_rng(&mut rand::rng())); - bench(&mut g, "pcg64", Pcg64::from_rng(&mut rand::rng())); - bench(&mut g, "pcg64mcg", Pcg64Mcg::from_rng(&mut rand::rng())); - bench(&mut g, "pcg64dxsm", Pcg64Dxsm::from_rng(&mut rand::rng())); - bench(&mut g, "chacha8", ChaCha8Rng::from_rng(&mut rand::rng())); - bench(&mut g, "chacha12", ChaCha12Rng::from_rng(&mut rand::rng())); - bench(&mut g, "chacha20", ChaCha20Rng::from_rng(&mut rand::rng())); - bench(&mut g, "std", StdRng::from_rng(&mut rand::rng())); - bench(&mut g, "small", SmallRng::from_rng(&mut rand::rng())); + bench(&mut g, "pcg32", rand::make_rng::()); + bench(&mut g, "pcg64", rand::make_rng::()); + bench(&mut g, "pcg64mcg", rand::make_rng::()); + bench(&mut g, "pcg64dxsm", rand::make_rng::()); + bench(&mut g, "chacha8", rand::make_rng::()); + bench(&mut g, "chacha12", rand::make_rng::()); + bench(&mut g, "chacha20", rand::make_rng::()); + bench(&mut g, "std", rand::make_rng::()); + bench(&mut g, "small", rand::make_rng::()); bench(&mut g, "os", UnwrapErr(SysRng)); bench(&mut g, "thread", rand::rng()); @@ -66,15 +66,15 @@ pub fn random_u32(c: &mut Criterion) { }); } - bench(&mut g, "pcg32", Pcg32::from_rng(&mut rand::rng())); - bench(&mut g, "pcg64", Pcg64::from_rng(&mut rand::rng())); - bench(&mut g, "pcg64mcg", Pcg64Mcg::from_rng(&mut rand::rng())); - bench(&mut g, "pcg64dxsm", Pcg64Dxsm::from_rng(&mut rand::rng())); - bench(&mut g, "chacha8", ChaCha8Rng::from_rng(&mut rand::rng())); - bench(&mut g, "chacha12", ChaCha12Rng::from_rng(&mut rand::rng())); - bench(&mut g, "chacha20", ChaCha20Rng::from_rng(&mut rand::rng())); - bench(&mut g, "std", StdRng::from_rng(&mut rand::rng())); - bench(&mut g, "small", SmallRng::from_rng(&mut rand::rng())); + bench(&mut g, "pcg32", rand::make_rng::()); + bench(&mut g, "pcg64", rand::make_rng::()); + bench(&mut g, "pcg64mcg", rand::make_rng::()); + bench(&mut g, "pcg64dxsm", rand::make_rng::()); + bench(&mut g, "chacha8", rand::make_rng::()); + bench(&mut g, "chacha12", rand::make_rng::()); + bench(&mut g, "chacha20", rand::make_rng::()); + bench(&mut g, "std", rand::make_rng::()); + bench(&mut g, "small", rand::make_rng::()); bench(&mut g, "os", UnwrapErr(SysRng)); bench(&mut g, "thread", rand::rng()); @@ -94,15 +94,15 @@ pub fn random_u64(c: &mut Criterion) { }); } - bench(&mut g, "pcg32", Pcg32::from_rng(&mut rand::rng())); - bench(&mut g, "pcg64", Pcg64::from_rng(&mut rand::rng())); - bench(&mut g, "pcg64mcg", Pcg64Mcg::from_rng(&mut rand::rng())); - bench(&mut g, "pcg64dxsm", Pcg64Dxsm::from_rng(&mut rand::rng())); - bench(&mut g, "chacha8", ChaCha8Rng::from_rng(&mut rand::rng())); - bench(&mut g, "chacha12", ChaCha12Rng::from_rng(&mut rand::rng())); - bench(&mut g, "chacha20", ChaCha20Rng::from_rng(&mut rand::rng())); - bench(&mut g, "std", StdRng::from_rng(&mut rand::rng())); - bench(&mut g, "small", SmallRng::from_rng(&mut rand::rng())); + bench(&mut g, "pcg32", rand::make_rng::()); + bench(&mut g, "pcg64", rand::make_rng::()); + bench(&mut g, "pcg64mcg", rand::make_rng::()); + bench(&mut g, "pcg64dxsm", rand::make_rng::()); + bench(&mut g, "chacha8", rand::make_rng::()); + bench(&mut g, "chacha12", rand::make_rng::()); + bench(&mut g, "chacha20", rand::make_rng::()); + bench(&mut g, "std", rand::make_rng::()); + bench(&mut g, "small", rand::make_rng::()); bench(&mut g, "os", UnwrapErr(SysRng)); bench(&mut g, "thread", rand::rng()); @@ -116,7 +116,7 @@ pub fn init_gen(c: &mut Criterion) { fn bench(g: &mut BenchmarkGroup, name: &str) { g.bench_function(name, |b| { - let mut rng = Pcg32::from_rng(&mut rand::rng()); + let mut rng: Pcg32 = rand::make_rng(); b.iter(|| R::from_rng(&mut rng)); }); } @@ -141,7 +141,7 @@ pub fn init_from_u64(c: &mut Criterion) { fn bench(g: &mut BenchmarkGroup, name: &str) { g.bench_function(name, |b| { - let mut rng = Pcg32::from_rng(&mut rand::rng()); + let mut rng: Pcg32 = rand::make_rng(); let seed = rng.random(); b.iter(|| R::seed_from_u64(black_box(seed))); }); @@ -170,7 +170,7 @@ pub fn init_from_seed(c: &mut Criterion) { rand::distr::StandardUniform: Distribution<::Seed>, { g.bench_function(name, |b| { - let mut rng = Pcg32::from_rng(&mut rand::rng()); + let mut rng: Pcg32 = rand::make_rng(); let seed = rng.random(); b.iter(|| R::from_seed(black_box(seed.clone()))); }); diff --git a/benches/benches/seq_choose.rs b/benches/benches/seq_choose.rs index e6d6c80d52..92a0bdd001 100644 --- a/benches/benches/seq_choose.rs +++ b/benches/benches/seq_choose.rs @@ -20,7 +20,7 @@ criterion_main!(benches); pub fn bench(c: &mut Criterion) { c.bench_function("seq_slice_choose_1_of_100", |b| { - let mut rng = Pcg32::from_rng(&mut rand::rng()); + let mut rng: Pcg32 = rand::make_rng(); let mut buf = [0i32; 100]; rng.fill(&mut buf); let x = black_box(&mut buf); @@ -32,7 +32,7 @@ pub fn bench(c: &mut Criterion) { for (amount, len) in lens { let name = format!("seq_slice_sample_{amount}_of_{len}"); c.bench_function(name.as_str(), |b| { - let mut rng = Pcg32::from_rng(&mut rand::rng()); + let mut rng: Pcg32 = rand::make_rng(); let mut buf = [0i32; 1000]; rng.fill(&mut buf); let x = black_box(&buf[..len]); @@ -56,7 +56,7 @@ pub fn bench(c: &mut Criterion) { for (amount, len) in lens { let name = format!("seq_slice_sample_weighted_{amount}_of_{len}"); c.bench_function(name.as_str(), |b| { - let mut rng = Pcg32::from_rng(&mut rand::rng()); + let mut rng: Pcg32 = rand::make_rng(); let mut buf = [0i32; 1000]; rng.fill(&mut buf); let x = black_box(&buf[..len]); @@ -78,7 +78,7 @@ pub fn bench(c: &mut Criterion) { } c.bench_function("seq_iter_sample_10_of_100", |b| { - let mut rng = Pcg32::from_rng(&mut rand::rng()); + let mut rng: Pcg32 = rand::make_rng(); let mut buf = [0i32; 100]; rng.fill(&mut buf); let x = black_box(&buf); @@ -86,7 +86,7 @@ pub fn bench(c: &mut Criterion) { }); c.bench_function("seq_iter_sample_fill_10_of_100", |b| { - let mut rng = Pcg32::from_rng(&mut rand::rng()); + let mut rng: Pcg32 = rand::make_rng(); let mut buf = [0i32; 100]; rng.fill(&mut buf); let x = black_box(&buf); diff --git a/benches/benches/shuffle.rs b/benches/benches/shuffle.rs index e4767f4f57..8ace45a5a1 100644 --- a/benches/benches/shuffle.rs +++ b/benches/benches/shuffle.rs @@ -20,7 +20,7 @@ criterion_main!(benches); pub fn bench(c: &mut Criterion) { c.bench_function("seq_shuffle_100", |b| { - let mut rng = Pcg32::from_rng(&mut rand::rng()); + let mut rng: Pcg32 = rand::make_rng(); let mut buf = [0i32; 100]; rng.fill(&mut buf); let x = black_box(&mut buf); diff --git a/benches/benches/simd.rs b/benches/benches/simd.rs index 1515125c64..b5515daf61 100644 --- a/benches/benches/simd.rs +++ b/benches/benches/simd.rs @@ -30,47 +30,47 @@ pub fn simd(c: &mut Criterion) { let mut g = c.benchmark_group("random_simd"); g.bench_function("u128", |b| { - let mut rng = Pcg64Mcg::from_rng(&mut rand::rng()); + let mut rng: Pcg64Mcg = rand::make_rng(); b.iter(|| rng.random::()); }); g.bench_function("m128i", |b| { - let mut rng = Pcg64Mcg::from_rng(&mut rand::rng()); + let mut rng: Pcg64Mcg = rand::make_rng(); b.iter(|| rng.random::()); }); g.bench_function("m256i", |b| { - let mut rng = Pcg64Mcg::from_rng(&mut rand::rng()); + let mut rng: Pcg64Mcg = rand::make_rng(); b.iter(|| rng.random::()); }); g.bench_function("m512i", |b| { - let mut rng = Pcg64Mcg::from_rng(&mut rand::rng()); + let mut rng: Pcg64Mcg = rand::make_rng(); b.iter(|| rng.random::()); }); g.bench_function("u64x2", |b| { - let mut rng = Pcg64Mcg::from_rng(&mut rand::rng()); + let mut rng: Pcg64Mcg = rand::make_rng(); b.iter(|| rng.random::()); }); g.bench_function("u32x4", |b| { - let mut rng = Pcg64Mcg::from_rng(&mut rand::rng()); + let mut rng: Pcg64Mcg = rand::make_rng(); b.iter(|| rng.random::()); }); g.bench_function("u32x8", |b| { - let mut rng = Pcg64Mcg::from_rng(&mut rand::rng()); + let mut rng: Pcg64Mcg = rand::make_rng(); b.iter(|| rng.random::()); }); g.bench_function("u16x8", |b| { - let mut rng = Pcg64Mcg::from_rng(&mut rand::rng()); + let mut rng: Pcg64Mcg = rand::make_rng(); b.iter(|| rng.random::()); }); g.bench_function("u8x16", |b| { - let mut rng = Pcg64Mcg::from_rng(&mut rand::rng()); + let mut rng: Pcg64Mcg = rand::make_rng(); b.iter(|| rng.random::()); }); } diff --git a/benches/benches/standard.rs b/benches/benches/standard.rs index 5bd74020af..a58f7049b7 100644 --- a/benches/benches/standard.rs +++ b/benches/benches/standard.rs @@ -26,7 +26,7 @@ where { g.throughput(criterion::Throughput::Bytes(core::mem::size_of::() as u64)); g.bench_function(name, |b| { - let mut rng = Pcg64Mcg::from_rng(&mut rand::rng()); + let mut rng: Pcg64Mcg = rand::make_rng(); b.iter(|| rng.sample::(D::default())); }); diff --git a/benches/benches/uniform.rs b/benches/benches/uniform.rs index 1309a9a518..30f1e2919d 100644 --- a/benches/benches/uniform.rs +++ b/benches/benches/uniform.rs @@ -59,7 +59,7 @@ macro_rules! sample { ($R:ty, $T:ty, $U:ty, $len:tt, $g:expr) => { $g.bench_function(BenchmarkId::new(stringify!($R), "single"), |b| { - let mut rng = <$R>::from_rng(&mut rand::rng()); + let mut rng: $R = rand::make_rng(); let range = sample!(@range $T, $U, $len, rng); let low = sample!(@MIN $T, $len); let high = sample!(@wrapping_add low, range, $len); @@ -68,7 +68,7 @@ macro_rules! sample { }); $g.bench_function(BenchmarkId::new(stringify!($R), "distr"), |b| { - let mut rng = <$R>::from_rng(&mut rand::rng()); + let mut rng: $R = rand::make_rng(); let range = sample!(@range $T, $U, $len, rng); let low = sample!(@MIN $T, $len); let high = sample!(@wrapping_add low, range, $len); diff --git a/benches/benches/uniform_float.rs b/benches/benches/uniform_float.rs index e3ff079f88..3aede4b3a1 100644 --- a/benches/benches/uniform_float.rs +++ b/benches/benches/uniform_float.rs @@ -27,7 +27,7 @@ const N_RESAMPLES: usize = 10_000; macro_rules! single_random { ($R:ty, $T:ty, $g:expr) => { $g.bench_function(BenchmarkId::new(stringify!($T), stringify!($R)), |b| { - let mut rng = <$R>::from_rng(&mut rand::rng()); + let mut rng: $R = rand::make_rng(); let (mut low, mut high); loop { low = <$T>::from_bits(rng.random()); @@ -63,7 +63,7 @@ fn single_random(c: &mut Criterion) { macro_rules! distr_random { ($R:ty, $T:ty, $g:expr) => { $g.bench_function(BenchmarkId::new(stringify!($T), stringify!($R)), |b| { - let mut rng = <$R>::from_rng(&mut rand::rng()); + let mut rng: $R = rand::make_rng(); let dist = loop { let low = <$T>::from_bits(rng.random()); let high = <$T>::from_bits(rng.random()); diff --git a/benches/benches/weighted.rs b/benches/benches/weighted.rs index 115883c5b2..e5ba371224 100644 --- a/benches/benches/weighted.rs +++ b/benches/benches/weighted.rs @@ -53,7 +53,7 @@ pub fn bench(c: &mut Criterion) { c.bench_function(name.as_str(), |b| { let length = black_box(length); let amount = black_box(amount); - let mut rng = SmallRng::from_rng(&mut rand::rng()); + let mut rng: SmallRng = rand::make_rng(); b.iter(|| sample_weighted(&mut rng, length, |idx| (1 + (idx % 100)) as u32, amount)) }); } diff --git a/src/prelude.rs b/src/prelude.rs index 1661925a1d..e7500acc39 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -14,7 +14,7 @@ //! //! ``` //! use rand::prelude::*; -//! # let mut r = StdRng::from_rng(&mut rand::rng()); +//! # let mut r: StdRng = rand::make_rng(); //! # let _: f32 = r.random(); //! ``` diff --git a/src/rngs/small.rs b/src/rngs/small.rs index 2789b29d10..b142cae418 100644 --- a/src/rngs/small.rs +++ b/src/rngs/small.rs @@ -41,12 +41,11 @@ type Rng = super::xoshiro256plusplus::Xoshiro256PlusPlus; /// suitable for seeding, but note that, even with a fixed seed, output is not /// [portable]. Some suggestions: /// -/// 1. To automatically seed with a unique seed, use [`SeedableRng::from_rng`]: +/// 1. To automatically seed with a unique seed, use [`rand::make_rng`]: /// ``` -/// use rand::SeedableRng; /// use rand::rngs::SmallRng; -/// let rng = SmallRng::from_rng(&mut rand::rng()); -/// # let _: SmallRng = rng; +/// let mut rng: SmallRng = rand::make_rng(); +/// # let _ = rand::Rng::next_u32(&mut rng); /// ``` /// 2. To use a deterministic integral seed, use `seed_from_u64`. This uses a /// hash function internally to yield a (typically) good seed from any diff --git a/src/rngs/std.rs b/src/rngs/std.rs index 63ca75f479..e17333c619 100644 --- a/src/rngs/std.rs +++ b/src/rngs/std.rs @@ -42,11 +42,12 @@ use chacha20::ChaCha12Rng as Rng; /// # let _: StdRng = rng; /// ``` /// -/// Seeding via [`rand::rng()`](crate::rng()) may be faster: +/// Seeding via [`rand::make_rng()`] or [`rand::rng()`](crate::rng()) may be +/// faster: /// ``` -/// # use rand::{SeedableRng, rngs::StdRng}; -/// let rng = StdRng::from_rng(&mut rand::rng()); -/// # let _: StdRng = rng; +/// # use rand::rngs::StdRng; +/// let mut rng: StdRng = rand::make_rng(); +/// # let _ = rand::Rng::next_u32(&mut rng); /// ``` /// /// Any [`SeedableRng`] method may be used, but note that `seed_from_u64` is not From 3a4f284122897ae3b55cd5daaf853dae867646ea Mon Sep 17 00:00:00 2001 From: Diggory Hardy Date: Wed, 4 Feb 2026 15:05:27 +0000 Subject: [PATCH 3/4] Fix doc links --- src/lib.rs | 4 ++++ src/rngs/small.rs | 3 ++- src/rngs/std.rs | 4 +++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index ffee07c770..e53c6b44f1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -105,6 +105,10 @@ use crate::distr::{Distribution, StandardUniform}; /// # Security /// /// Refer to [`ThreadRng#Security`]. +/// +/// [`SysRng`]: crate::rngs::SysRng +/// [`ThreadRng`]: crate::rngs::ThreadRng +/// [`ThreadRng#Security`]: crate::rngs::ThreadRng#security #[cfg(feature = "sys_rng")] pub fn make_rng() -> R { #[cfg(feature = "thread_rng")] diff --git a/src/rngs/small.rs b/src/rngs/small.rs index b142cae418..9535be35bb 100644 --- a/src/rngs/small.rs +++ b/src/rngs/small.rs @@ -41,7 +41,7 @@ type Rng = super::xoshiro256plusplus::Xoshiro256PlusPlus; /// suitable for seeding, but note that, even with a fixed seed, output is not /// [portable]. Some suggestions: /// -/// 1. To automatically seed with a unique seed, use [`rand::make_rng`]: +/// 1. To automatically seed with a unique seed, use [`rand::make_rng()`]: /// ``` /// use rand::rngs::SmallRng; /// let mut rng: SmallRng = rand::make_rng(); @@ -73,6 +73,7 @@ type Rng = super::xoshiro256plusplus::Xoshiro256PlusPlus; /// [rand_xoshiro]: https://crates.io/crates/rand_xoshiro /// [`rand_seeder`]: https://docs.rs/rand_seeder/latest/rand_seeder/ /// [`Rng`]: rand_core::Rng +/// [`rand::make_rng()`]: crate::make_rng #[derive(Clone, Debug, PartialEq, Eq)] pub struct SmallRng(Rng); diff --git a/src/rngs/std.rs b/src/rngs/std.rs index e17333c619..25675fc076 100644 --- a/src/rngs/std.rs +++ b/src/rngs/std.rs @@ -42,7 +42,7 @@ use chacha20::ChaCha12Rng as Rng; /// # let _: StdRng = rng; /// ``` /// -/// Seeding via [`rand::make_rng()`] or [`rand::rng()`](crate::rng()) may be +/// Seeding via [`rand::make_rng()`] or [`rand::rng()`] may be /// faster: /// ``` /// # use rand::rngs::StdRng; @@ -66,6 +66,8 @@ use chacha20::ChaCha12Rng as Rng; /// [chacha20]: https://crates.io/crates/chacha20 /// [rand issue]: https://github.com/rust-random/rand/issues/932 /// [`Rng`]: rand_core::Rng +/// [`rand::make_rng()`]: crate::make_rng +/// [`rand::rng()`]: crate::rng #[derive(Debug, PartialEq, Eq)] pub struct StdRng(Rng); From b275cb60ef79b082da4e26cd7025254d981f6ccb Mon Sep 17 00:00:00 2001 From: Diggory Hardy Date: Sat, 7 Feb 2026 08:28:21 +0000 Subject: [PATCH 4/4] CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 854caa79f1..518509b973 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ You may also find the [Upgrade Guide](https://rust-random.github.io/book/update. - Add fns `IndexedRandom::choose_iter`, `choose_weighted_iter` ([#1632]) - Pub export `Xoshiro128PlusPlus`, `Xoshiro256PlusPlus` prngs ([#1649]) - Pub export `ChaCha8Rng`, `ChaCha12Rng`, `ChaCha20Rng` behind `chacha` feature ([#1659]) +- Fn `rand::make_rng() -> R where R: SeedableRng` ([#1734]) ### Removals - Removed `ReseedingRng` ([#1722]) @@ -50,6 +51,7 @@ You may also find the [Upgrade Guide](https://rust-random.github.io/book/update. [#1717]: https://github.com/rust-random/rand/pull/1717 [#1722]: https://github.com/rust-random/rand/pull/1722 [#1732]: https://github.com/rust-random/rand/pull/1732 +[#1734]: https://github.com/rust-random/rand/pull/1734 ## [0.9.2] - 2025-07-20