Skip to content

Add fn rand::make_rng - #1734

Merged
dhardy merged 4 commits into
masterfrom
push-rtuwusonuukn
Feb 8, 2026
Merged

dhardy merged 4 commits into
masterfrom
push-rtuwusonuukn

Conversation

@dhardy

@dhardy dhardy commented Feb 4, 2026 •

Copy link
Copy Markdown
Member
  • Added a CHANGELOG.md entry

Summary

Adds:

/// 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: SeedableRng>() -> R { /* ... */ }

Motivation

We have removed SeedableRng::from_os_rng() since the last release. SomeRng::try_from_rng(&mut getrandom::SysRng).unwrap() is not exactly convenient to use.

We could put something like this under getrandom, but it feels more appropriate within rand (also allowing usage of ThreadRng).

Details

This is also slightly contentious, but I feel it's useful enough to be worth having. We could add trait SeedableRngExt instead, but that would have significantly more API surface.

@dhardy
dhardy requested review from josephlr, newpavlov and vks February 4, 2026 12:30
@newpavlov

newpavlov commented Feb 4, 2026 •

Copy link
Copy Markdown
Member

Wouldn't it be better to introduce RngExt::from_sys_rng() -> Self where Self: SeedableRng?

@dhardy

dhardy commented Feb 4, 2026

Copy link
Copy Markdown
Member Author

That would allow SomeRng::from_sys_rng(), but I prefer this since:

  • RngExt is a surprising place to put from_sys_rng
  • Using RngExt may require an extra import (<SomeRng as rand::RngExt>::from_sys_rng() is quite convoluted)

@dhardy
dhardy force-pushed the push-rtuwusonuukn branch from 2ba057a to b275cb6 Compare February 7, 2026 17:33
@dhardy
dhardy requested a review from mstoeckl February 7, 2026 17:33

@mstoeckl mstoeckl left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. This looks like a relatively low impact change; I expect it will be hard to confuse with rand::rng (since that returns the non-seedable ThreadRng; and the documentation is clear in both cases.)

One possible issue is that SysRng isn't infallible, so this can panic... (but so can ThreadRng, on first use.)

@dhardy
dhardy merged commit 95c5165 into master Feb 8, 2026
16 checks passed
@dhardy
dhardy deleted the push-rtuwusonuukn branch February 8, 2026 07:29
renovate Bot added a commit to gwennlbh/shapemaker that referenced this pull request Sep 27, 2026
##### [v0.10.3](https://github.com/rust-random/rand/blob/HEAD/CHANGELOG.md#0103--2026-09-20)

##### Fixes

- Fix `WeightedIndex` panic when the sum of float weights is infinite; return `Error::Overflow` instead ([#1808])
- Fix spurious `Error::NonFinite` from `Uniform::new_inclusive` on large finite float ranges such as `0.0..=f64::MAX` ([#1821])
- Fix possible panic due to sampling a deserialized `Uniform<char>` ([#1831])

##### Changes

- Report exact remaining lengths from `WeightedIndex::weights()` and reduce overhead when reading weights ([#1838])

[#1808]: rust-random/rand#1808

[#1821]: rust-random/rand#1821

[#1831]: rust-random/rand#1831

[#1838]: rust-random/rand#1838
##### [v0.10.2](https://github.com/rust-random/rand/blob/HEAD/CHANGELOG.md#0102--2026-07-02)

##### Fixes

- Fix possible memory safety violation due to deserialization of `UniformChar` from bad source ([#1790])

##### Changes

- Document required output order of fn `partial_shuffle` and apply `#[must_use]` ([#1769])
- Avoid usage of `unsafe` in contexts where non-local memory corruption could invalidate contract ([#1791])

[#1769]: rust-random/rand#1769

[#1790]: rust-random/rand#1790

[#1791]: rust-random/rand#1791
##### [v0.10.1](https://github.com/rust-random/rand/blob/HEAD/CHANGELOG.md#0101--2026-02-11)

This release includes a fix for a soundness bug; see [#1763].

##### Changes

- Document panic behavior of `make_rng` and add `#[track_caller]` ([#1761])
- Deprecate feature `log` ([#1763])

[#1761]: rust-random/rand#1761

[#1763]: rust-random/rand#1763
##### [v0.10.0](https://github.com/rust-random/rand/blob/HEAD/CHANGELOG.md#0100---2026-02-08)

##### Changes

- The dependency on `rand_chacha` has been replaced with a dependency on `chacha20`. This changes the implementation behind `StdRng`, but the output remains the same. There may be some API breakage when using the ChaCha-types directly as these are now the ones in `chacha20` instead of `rand_chacha` ([#1642]).
- Rename fns `IndexedRandom::choose_multiple` -> `sample`, `choose_multiple_array` -> `sample_array`, `choose_multiple_weighted` -> `sample_weighted`, struct `SliceChooseIter` -> `IndexedSamples` and fns `IteratorRandom::choose_multiple` -> `sample`, `choose_multiple_fill` -> `sample_fill` ([#1632])
- Use Edition 2024 and MSRV 1.85 ([#1653])
- Let `Fill` be implemented for element types, not sliceable types ([#1652])
- Fix `OsError::raw_os_error` on UEFI targets by returning `Option<usize>` ([#1665])
- Replace fn `TryRngCore::read_adapter(..) -> RngReadAdapter` with simpler struct `RngReader` ([#1669])
- Remove fns `SeedableRng::from_os_rng`, `try_from_os_rng` ([#1674])
- Remove `Clone` support for `StdRng`, `ReseedingRng` ([#1677])
- Use `postcard` instead of `bincode` to test the serde feature ([#1693])
- Avoid excessive allocation in `IteratorRandom::sample` when `amount` is much larger than iterator size ([#1695])
- Rename `os_rng` -> `sys_rng`, `OsRng` -> `SysRng`, `OsError` -> `SysError` ([#1697])
- Rename `Rng` -> `RngExt` as upstream `rand_core` has renamed `RngCore` -> `Rng` ([#1717])

##### Additions

- 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])
- Removed unused feature "nightly" ([#1732])
- Removed feature `small_rng` ([#1732])

[#1632]: rust-random/rand#1632

[#1642]: rust-random/rand#1642

[#1649]: rust-random/rand#1649

[#1652]: rust-random/rand#1652

[#1653]: rust-random/rand#1653

[#1659]: rust-random/rand#1659

[#1665]: rust-random/rand#1665

[#1669]: rust-random/rand#1669

[#1674]: rust-random/rand#1674

[#1677]: rust-random/rand#1677

[#1693]: rust-random/rand#1693

[#1695]: rust-random/rand#1695

[#1697]: rust-random/rand#1697

[#1717]: rust-random/rand#1717

[#1722]: rust-random/rand#1722

[#1732]: rust-random/rand#1732

[#1734]: rust-random/rand#1734
##### [v0.9.5](https://github.com/rust-random/rand/releases/tag/0.9.5)

#### What's Changed

- rand v0.9.5: backport [#1790](rust-random/rand#1790) by [@dhardy](https://github.com/dhardy) in [#1803](rust-random/rand#1803)

**Full Changelog**: <rust-random/rand@0.9.4...0.9.5>
##### [v0.9.4](https://github.com/rust-random/rand/releases/tag/0.9.4)

##### Fixes

- Fix doc build ([#1766])

[#1766]: rust-random/rand#1766

**Full Changelog**: <rust-random/rand@0.9.3...0.9.4>
##### [v0.9.3](rust-random/rand@0.9.2...0.9.3)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants