From 0c2a9b74f3488a4bb6f17f78b80d1068c2c7d7d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9F=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=20=5BArtyom=20Pavlov=5D?= Date: Fri, 23 Jan 2026 18:21:24 +0300 Subject: [PATCH 1/6] Reorganize changelog for v0.10.0 --- CHANGELOG.md | 93 ++++++++++++++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 43 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33cd57ec..460d42fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,41 +5,48 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [0.10.0] - Unreleased -### API changes -- `RngCore` and `TryRngCore` are renamed to `Rng` and `TryRng` respectively ([#54]) -- Relax `Sized` bound on impls of `SeedableRng` ([rand#1641]) -- Move `rand_core::impls::*` to `rand_core::le` module ([rand#1667]) -- Use Edition 2024 and MSRV 1.85 ([rand#1668]) -- Remove fn `TryRng::read_adapter(..) -> RngReadAdapter` (replaced with `rand::RngReader`) ([rand#1669]) -- Remove feature `os_rng`, structs `OsRng` and `OsError` and fns `from_os_rng`, `try_from_os_rng` ([rand#1674]) -- Remove feature `std` ([rand#1674]) -- Removed dependency `getrandom` ([rand#1674]) -- Removed optional dependency `serde` ([#28]) -- Add `SeedableRng::fork` methods ([#17]) -- Rename trait `block::BlockRngCore` to `block::Generator` and associated type `Results` to `Output`; remove assoc. `type Item` and remove type bounds ([#26]) -- Add `fn drop` to trait `block::Generator` ([#35]) -- Remove `BlockRng64` ([#34]) -- Remove impl of `Rng` for `BlockRng`, making the latter more generic ([#34]) -- Add trait `le::Word` ([#34]) -- Add fn `BlockRng::reconstruct` and fn `BlockRng::remaining_results` ([#36]) -- Move `le::{Word, next_u64_via_u32}` to new `utils` module; remove `le` ([#38]) -- Replace `le::fill_bytes_via_next` with `utils::fill_bytes_via_next_word` ([#38]) -- Replace `le::next_u32_via_fill` and `le::next_u64_via_fill` with `utils::next_word_via_fill` ([#38]) -- Replace `le::read_u32_into` and `le::read_u64_into` with `utils::read_words` ([#38]) -- Replace fn `BlockRng::index` with `word_offset` ([#44]) -- Rename fn `BlockRng::generate_and_set` -> `reset_and_skip`; remove fn `reset` ([#44]) -- `Rng` is now an extension trait of `TryRng` ([#45]) -- Remove `UnwrapMut` and fns `unwrap_mut`, `unwrap_err`, retaining `UnwrapErr` ([#45], [#53]) -- Add error handling to `utils` functions over `TryRng` or via closure ([#45]) ### Added +- `SeedableRng::fork` methods ([#17]) +- `le::Word` trait ([#34]) +- `BlockRng::reconstruct` and `BlockRng::remaining_results` methods ([#36]) - Re-export of `core::convert::Infallible` ([#56]) +- `utils::{fill_bytes_via_next_word, next_word_via_fill, read_words}` functions ([#38]) +- `block::Generator::drop` method ([#35]) +- `BlockRng::word_offset` method ([#44]) ### Changed -- `TryRng::Error` is bound on `core::error::Error` instead of `Debug + Display` ([#58]) - -### Other -- Changed repository from [rust-random/rand] to [rust-random/core]. +- `RngCore` and `TryRngCore` are renamed to `Rng` and `TryRng` respectively ([#54]) +- `Rng` is now an extension trait of `TryRng` ([#45]) +- Relax `Sized` bound on impls of `SeedableRng` ([rand#1641]) +- Edition changed to 2024 and MSRV bumped to 1.85 ([rand#1668]) +- `TryRng::Error` is bound on `core::error::Error` instead of `Debug + Display` ([#58]) +- Move `rand_core::impls::*` to `rand_core::utils` module ([rand#1667], [#38]) +- `utils` functions to operate over `TryRng` or via closure ([#45]) +- Rename `BlockRng::generate_and_set` method to `reset_and_skip` ([#44]) +- Rename `block::BlockRngCore` trait to `block::Generator` ([#26]) +- Rename `BlockRngCore::Results` associated type to `Output` and remove type bounds on it ([#26]) +- Repository from [rust-random/rand] to [rust-random/rand_core] + +### Removed +- `TryRng::read_adapter` method (replaced with `rand::RngReader`) ([rand#1669]) +- `os_rng` crate feature ([rand#1674]) +- `OsRng` and `OsError` structs ([rand#1674]) +- `SeedableRng::from_os_rng` and `SeedableRng::try_from_os_rng` methods ([rand#1674]) +- `getrandom` dependency ([rand#1674]) +- `std` crate feature ([rand#1674]) +- Optional `serde` dependency ([#28]) +- `le::fill_bytes_via_next` (replaced with `utils::fill_bytes_via_next_word`) ([#38]) +- `le::{next_u32_via_fill, next_u64_via_fill}` functions + (replaced with `utils::next_word_via_fill`) ([#38]) +- `le::{read_u32_into, read_u64_into}` (replaced with `utils::read_words`) ([#38]) +- `UnwrapMut` struct and `Rng::unwrap_mut` method ([#45]) +- `Rng::unwrap_err` method in favor of explicit wrapping in `UnwrapErr` ([#53]) +- Implementation of `Rng` for `BlockRng`, making the latter more generic ([#34]) +- `BlockRng64` struct ([#34]) +- `BlockRng::reset` method ([#44]) +- `BlockRng::index` method (replaced with `BlockRng::word_offset`) ([#44]) +- `Generator::Item` associated type ([#26]) [0.10.0]: https://github.com/rust-random/core/compare/v0.9.3...HEAD @@ -48,21 +55,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [rand#1668]: https://github.com/rust-random/rand/pull/1668 [rand#1669]: https://github.com/rust-random/rand/pull/1669 [rand#1674]: https://github.com/rust-random/rand/pull/1674 -[#17]: https://github.com/rust-random/rand-core/pull/17 -[#26]: https://github.com/rust-random/rand-core/pull/28 -[#28]: https://github.com/rust-random/rand-core/pull/28 -[#34]: https://github.com/rust-random/rand-core/pull/34 -[#35]: https://github.com/rust-random/rand-core/pull/35 -[#36]: https://github.com/rust-random/rand-core/pull/36 -[#38]: https://github.com/rust-random/rand-core/pull/38 -[#44]: https://github.com/rust-random/rand-core/pull/44 -[#45]: https://github.com/rust-random/rand-core/pull/45 -[#53]: https://github.com/rust-random/rand-core/pull/53 -[#56]: https://github.com/rust-random/rand-core/pull/56 -[#58]: https://github.com/rust-random/rand-core/pull/58 +[#17]: https://github.com/rust-random/rand_core/pull/17 +[#26]: https://github.com/rust-random/rand_core/pull/28 +[#28]: https://github.com/rust-random/rand_core/pull/28 +[#34]: https://github.com/rust-random/rand_core/pull/34 +[#35]: https://github.com/rust-random/rand_core/pull/35 +[#36]: https://github.com/rust-random/rand_core/pull/36 +[#38]: https://github.com/rust-random/rand_core/pull/38 +[#44]: https://github.com/rust-random/rand_core/pull/44 +[#45]: https://github.com/rust-random/rand_core/pull/45 +[#53]: https://github.com/rust-random/rand_core/pull/53 +[#56]: https://github.com/rust-random/rand_core/pull/56 +[#58]: https://github.com/rust-random/rand_core/pull/58 [rust-random/rand]: https://github.com/rust-random/rand -[rust-random/core]: https://github.com/rust-random/core +[rust-random/rand_core]: https://github.com/rust-random/rand_core ## [0.9.3] - 2025-02-29 ### Other From 72e86d6dd5bad59496c4df699707470cbaba65ab Mon Sep 17 00:00:00 2001 From: Artyom Pavlov Date: Fri, 23 Jan 2026 20:22:02 +0300 Subject: [PATCH 2/6] apply suggestion Co-authored-by: Diggory Hardy --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 460d42fd..ecb32e44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - `SeedableRng::fork` methods ([#17]) -- `le::Word` trait ([#34]) +- `utils::Word` trait ([#34], [#38]) - `BlockRng::reconstruct` and `BlockRng::remaining_results` methods ([#36]) - Re-export of `core::convert::Infallible` ([#56]) - `utils::{fill_bytes_via_next_word, next_word_via_fill, read_words}` functions ([#38]) From ddc91d80152845b483416c79d685c4d4584e1840 Mon Sep 17 00:00:00 2001 From: Artyom Pavlov Date: Fri, 23 Jan 2026 20:22:10 +0300 Subject: [PATCH 3/6] apply suggestion Co-authored-by: Diggory Hardy --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ecb32e44..7ef8c424 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [0.10.0] - Unreleased ### Added -- `SeedableRng::fork` methods ([#17]) +- `SeedableRng::{fork, try_fork}` methods ([#17]) - `utils::Word` trait ([#34], [#38]) - `BlockRng::reconstruct` and `BlockRng::remaining_results` methods ([#36]) - Re-export of `core::convert::Infallible` ([#56]) From 815402dd10c38bb8c526c36fc31273e6a63a17c5 Mon Sep 17 00:00:00 2001 From: Artyom Pavlov Date: Fri, 23 Jan 2026 20:23:15 +0300 Subject: [PATCH 4/6] Move MSRV entry to the top of the changed section --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ef8c424..5ff8ca47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,10 +16,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `BlockRng::word_offset` method ([#44]) ### Changed +- Edition changed to 2024 and MSRV bumped to 1.85 ([rand#1668]) - `RngCore` and `TryRngCore` are renamed to `Rng` and `TryRng` respectively ([#54]) - `Rng` is now an extension trait of `TryRng` ([#45]) - Relax `Sized` bound on impls of `SeedableRng` ([rand#1641]) -- Edition changed to 2024 and MSRV bumped to 1.85 ([rand#1668]) - `TryRng::Error` is bound on `core::error::Error` instead of `Debug + Display` ([#58]) - Move `rand_core::impls::*` to `rand_core::utils` module ([rand#1667], [#38]) - `utils` functions to operate over `TryRng` or via closure ([#45]) From d546ec0c315c9e536bc36d58e4e9d85319a1de44 Mon Sep 17 00:00:00 2001 From: Artyom Pavlov Date: Fri, 23 Jan 2026 20:27:32 +0300 Subject: [PATCH 5/6] Merge `utils` entries into one changed entry --- CHANGELOG.md | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ff8ca47..59b462a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,10 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - `SeedableRng::{fork, try_fork}` methods ([#17]) -- `utils::Word` trait ([#34], [#38]) - `BlockRng::reconstruct` and `BlockRng::remaining_results` methods ([#36]) - Re-export of `core::convert::Infallible` ([#56]) -- `utils::{fill_bytes_via_next_word, next_word_via_fill, read_words}` functions ([#38]) - `block::Generator::drop` method ([#35]) - `BlockRng::word_offset` method ([#44]) @@ -21,8 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `Rng` is now an extension trait of `TryRng` ([#45]) - Relax `Sized` bound on impls of `SeedableRng` ([rand#1641]) - `TryRng::Error` is bound on `core::error::Error` instead of `Debug + Display` ([#58]) -- Move `rand_core::impls::*` to `rand_core::utils` module ([rand#1667], [#38]) -- `utils` functions to operate over `TryRng` or via closure ([#45]) +- Replaced `le` helper functions with new `utils` helpers ([rand#1667], [#34], [#38], [#45]) - Rename `BlockRng::generate_and_set` method to `reset_and_skip` ([#44]) - Rename `block::BlockRngCore` trait to `block::Generator` ([#26]) - Rename `BlockRngCore::Results` associated type to `Output` and remove type bounds on it ([#26]) @@ -36,10 +33,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `getrandom` dependency ([rand#1674]) - `std` crate feature ([rand#1674]) - Optional `serde` dependency ([#28]) -- `le::fill_bytes_via_next` (replaced with `utils::fill_bytes_via_next_word`) ([#38]) -- `le::{next_u32_via_fill, next_u64_via_fill}` functions - (replaced with `utils::next_word_via_fill`) ([#38]) -- `le::{read_u32_into, read_u64_into}` (replaced with `utils::read_words`) ([#38]) - `UnwrapMut` struct and `Rng::unwrap_mut` method ([#45]) - `Rng::unwrap_err` method in favor of explicit wrapping in `UnwrapErr` ([#53]) - Implementation of `Rng` for `BlockRng`, making the latter more generic ([#34]) From a211106cc6ac37fecdaaedf25865c09a6c378bf9 Mon Sep 17 00:00:00 2001 From: Artyom Pavlov Date: Fri, 23 Jan 2026 20:36:23 +0300 Subject: [PATCH 6/6] Fix repo links --- CHANGELOG.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59b462a7..5befbf89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,7 +41,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `BlockRng::index` method (replaced with `BlockRng::word_offset`) ([#44]) - `Generator::Item` associated type ([#26]) -[0.10.0]: https://github.com/rust-random/core/compare/v0.9.3...HEAD +[0.10.0]: https://github.com/rust-random/rand_core/compare/v0.9.3...HEAD [rand#1641]: https://github.com/rust-random/rand/pull/1641 [rand#1667]: https://github.com/rust-random/rand/pull/1667 @@ -69,7 +69,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Remove `zerocopy` dependency ([rand#1607]) - Deprecate `rand_core::impls::fill_via_u32_chunks`, `fill_via_u64_chunks` ([rand#1607]) -[0.9.3]: https://github.com/rust-random/core/compare/v0.9.2...v0.9.3 +[0.9.3]: https://github.com/rust-random/rand_core/compare/v0.9.2...v0.9.3 [rand#1607]: https://github.com/rust-random/rand/pull/1607 @@ -78,7 +78,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Relax `Sized` bound on impls of `TryRngCore`, `TryCryptoRng` and `UnwrapMut` ([rand#1593]) - Add `UnwrapMut::re` to reborrow the inner rng with a tighter lifetime ([rand#1595]) -[0.9.2]: https://github.com/rust-random/core/compare/v0.9.1...v0.9.2 +[0.9.2]: https://github.com/rust-random/rand_core/compare/v0.9.1...v0.9.2 [rand#1593]: https://github.com/rust-random/rand/pull/1593 [rand#1595]: https://github.com/rust-random/rand/pull/1595 @@ -87,7 +87,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### API changes - Add `TryRngCore::unwrap_mut`, providing an impl of `RngCore` over `&mut rng` ([rand#1589]) -[0.9.1]: https://github.com/rust-random/core/compare/v0.9.0...v0.9.1 +[0.9.1]: https://github.com/rust-random/rand_core/compare/v0.9.0...v0.9.1 [rand#1589]: https://github.com/rust-random/rand/pull/1589 @@ -108,7 +108,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Rename `fn SeedableRng::from_entropy` -> `from_os_rng` and add fallible variant `fn try_from_os_rng` ([rand#1424]) - Add bounds `Clone` and `AsRef` to associated type `SeedableRng::Seed` ([rand#1491]) -[0.9.0]: https://github.com/rust-random/core/compare/v0.6.4...v0.9.0 +[0.9.0]: https://github.com/rust-random/rand_core/compare/v0.6.4...v0.9.0 [rand#1182]: https://github.com/rust-random/rand/pull/1182 [rand#1267]: https://github.com/rust-random/rand/pull/1267 @@ -130,7 +130,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Reduce use of `unsafe` and improve gen_bytes performance ([rand#1180]) - Add `CryptoRngCore` trait ([rand#1187], [rand#1230]) -[0.6.4]: https://github.com/rust-random/core/compare/v0.6.3...v0.6.4 +[0.6.4]: https://github.com/rust-random/rand_core/compare/v0.6.3...v0.6.4 [rand#1160]: https://github.com/rust-random/rand/pull/1160 [rand#1180]: https://github.com/rust-random/rand/pull/1180 @@ -142,7 +142,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved bound for `serde` impls on `BlockRng` ([rand#1130]) - Minor doc additions ([rand#1118]) -[0.6.3]: https://github.com/rust-random/core/compare/v0.6.2...v0.6.3 +[0.6.3]: https://github.com/rust-random/rand_core/compare/v0.6.2...v0.6.3 [rand#1118]: https://github.com/rust-random/rand/pull/1118 [rand#1130]: https://github.com/rust-random/rand/pull/1130 @@ -152,7 +152,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed assertions in `le::read_u32_into` and `le::read_u64_into` which could have allowed buffers not to be fully populated ([rand#1096]) -[0.6.2]: https://github.com/rust-random/core/compare/v0.6.1...v0.6.2 +[0.6.2]: https://github.com/rust-random/rand_core/compare/v0.6.1...v0.6.2 [rand#1096]: https://github.com/rust-random/rand/pull/1096 @@ -163,7 +163,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Other - Enable all stable features in the playground ([rand#1081]) -[0.6.1]: https://github.com/rust-random/core/compare/v0.6.0...v0.6.1 +[0.6.1]: https://github.com/rust-random/rand_core/compare/v0.6.0...v0.6.1 [rand#1081]: https://github.com/rust-random/rand/pull/1081 [rand#1082]: https://github.com/rust-random/rand/pull/1082 @@ -182,7 +182,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix some clippy warnings ([rand#1036]) - Apply rustfmt ([rand#926]) -[0.6.0]: https://github.com/rust-random/core/compare/v0.5.1...v0.6.0 +[0.6.0]: https://github.com/rust-random/rand_core/compare/v0.5.1...v0.6.0 [rand#926]: https://github.com/rust-random/rand/pull/926 [rand#962]: https://github.com/rust-random/rand/pull/962 @@ -202,7 +202,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `alloc` feature in `no_std` is available since Rust 1.36 ([rand#856]) - Added `#[inline]` to `Error` conversion methods ([rand#864]) -[0.5.1]: https://github.com/rust-random/core/compare/v0.5.0...v0.5.1 +[0.5.1]: https://github.com/rust-random/rand_core/compare/v0.5.0...v0.5.1 [rand#863]: https://github.com/rust-random/rand/pull/863 [rand#864]: https://github.com/rust-random/rand/pull/864 @@ -215,7 +215,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Rewrite `Error` type and adjust API ([rand#800]) - Adjust usage of `#[inline]` for `BlockRng` and `BlockRng64` -[0.5.0]: https://github.com/rust-random/core/compare/v0.4.0...v0.5.0 +[0.5.0]: https://github.com/rust-random/rand_core/compare/v0.4.0...v0.5.0 [rand#779]: https://github.com/rust-random/rand/pull/779 [rand#780]: https://github.com/rust-random/rand/pull/780 @@ -228,7 +228,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Disable the `std` feature by default ([rand#702]) -[0.4.0]: https://github.com/rust-random/core/compare/v0.3.0...v0.4.0 +[0.4.0]: https://github.com/rust-random/rand_core/compare/v0.3.0...v0.4.0 [rand#702]: https://github.com/rust-random/rand/pull/702 @@ -236,7 +236,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Add `SeedableRng::seed_from_u64` for convenient seeding. ([rand#537]) -[0.3.0]: https://github.com/rust-random/core/compare/v0.2.1...v0.3.0 +[0.3.0]: https://github.com/rust-random/rand_core/compare/v0.2.1...v0.3.0 [rand#537]: https://github.com/rust-random/rand/pull/537 @@ -244,7 +244,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - References to a `CryptoRng` now also implement `CryptoRng`. ([rand#470]) -[0.2.1]: https://github.com/rust-random/core/compare/v0.2.0...v0.2.1 +[0.2.1]: https://github.com/rust-random/rand_core/compare/v0.2.0...v0.2.1 [rand#470]: https://github.com/rust-random/rand/pull/470 @@ -257,7 +257,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add `BlockRng{64}::index` and `BlockRng{64}::generate_and_set`. ([rand#374], [rand#419]) - Implement `std::io::Read` for RngCore. ([rand#434]) -[0.2.0]: https://github.com/rust-random/core/compare/v0.1.0...v0.2.0 +[0.2.0]: https://github.com/rust-random/rand_core/compare/v0.1.0...v0.2.0 [rand#374]: https://github.com/rust-random/rand/pull/374 [rand#409]: https://github.com/rust-random/rand/pull/409 @@ -278,7 +278,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Revise the `SeedableRng` trait. ([rand#233]) - Remove default implementations for `RngCore::next_u64` and `RngCore::fill_bytes`. ([rand#288]) -[0.1.0]: https://github.com/rust-random/core/compare/v0.0.0...v0.1.0 +[0.1.0]: https://github.com/rust-random/rand_core/compare/v0.0.0...v0.1.0 [rand#209]: https://github.com/rust-random/rand/pull/209 [rand#225]: https://github.com/rust-random/rand/pull/225