112 lines
6.0 KiB
Markdown
112 lines
6.0 KiB
Markdown
# Rand
|
|
|
|
[](https://github.com/rust-random/rand/actions)
|
|
[](https://crates.io/crates/rand)
|
|
[](https://rust-random.github.io/book/)
|
|
[](https://docs.rs/rand)
|
|
|
|
Rand is a set of crates supporting (pseudo-)random generators:
|
|
|
|
- Built over a standard RNG trait: [`rand_core::RngCore`](https://docs.rs/rand_core/latest/rand_core/trait.RngCore.html)
|
|
- With fast implementations of both [strong](https://rust-random.github.io/book/guide-rngs.html#cryptographically-secure-pseudo-random-number-generators-csprngs) and
|
|
[small](https://rust-random.github.io/book/guide-rngs.html#basic-pseudo-random-number-generators-prngs) generators: [`rand::rngs`](https://docs.rs/rand/latest/rand/rngs/index.html), and more RNGs: [`chacha20`](https://docs.rs/chacha20), [`rand_xoshiro`](https://docs.rs/rand_xoshiro/), [`rand_pcg`](https://docs.rs/rand_pcg/), [`rand_sfc`](https://docs.rs/rand_sfc/), [`rand_seeder`](https://docs.rs/rand_seeder/), [rngs repo](https://github.com/rust-random/rngs/)
|
|
- [`rand::rng`](https://docs.rs/rand/latest/rand/fn.rng.html) is an asymptotically-fast, automatically-seeded and reasonably strong generator available on all `std` targets
|
|
- Direct support for seeding generators from the [getrandom] crate
|
|
|
|
With broad support for random value generation and random processes:
|
|
|
|
- [`StandardUniform`](https://docs.rs/rand/latest/rand/distr/struct.StandardUniform.html) random value sampling,
|
|
[`Uniform`](https://docs.rs/rand/latest/rand/distr/struct.Uniform.html)-ranged value sampling
|
|
and [more](https://docs.rs/rand/latest/rand/distr/index.html)
|
|
- Samplers for a large number of non-uniform random number distributions via our own
|
|
[`rand_distr`](https://docs.rs/rand_distr) and via
|
|
the [`statrs`](https://docs.rs/statrs)
|
|
- Random processes (mostly choose and shuffle) via [`rand::seq`](https://docs.rs/rand/latest/rand/seq/index.html) traits
|
|
|
|
All with:
|
|
|
|
- [Portably reproducible output](https://rust-random.github.io/book/portability.html)
|
|
- `#[no_std]` compatibility (partial)
|
|
- *Many* performance optimisations thanks to contributions from the wide
|
|
user-base
|
|
|
|
Rand **is not**:
|
|
|
|
- Small (LoC). Most low-level crates are small, but the higher-level `rand`
|
|
and `rand_distr` each contain a lot of functionality.
|
|
- Simple (implementation). We have a strong focus on correctness, speed and flexibility, but
|
|
not simplicity. If you prefer a small-and-simple library, there are
|
|
alternatives including [fastrand](https://crates.io/crates/fastrand)
|
|
and [oorandom](https://crates.io/crates/oorandom).
|
|
- Primarily a cryptographic library. `rand` does provide some generators which
|
|
aim to support unpredictable value generation under certain constraints;
|
|
see [SECURITY.md](https://github.com/rust-random/rand/blob/master/SECURITY.md) for details.
|
|
Users are expected to determine for themselves
|
|
whether `rand`'s functionality meets their own security requirements.
|
|
|
|
Documentation:
|
|
|
|
- [The Rust Rand Book](https://rust-random.github.io/book)
|
|
- [API reference (docs.rs)](https://docs.rs/rand)
|
|
|
|
|
|
## Versions
|
|
|
|
Rand is *mature* (suitable for general usage, with infrequent breaking releases
|
|
which minimise breakage) but not yet at 1.0. Current `MAJOR.MINOR` versions are:
|
|
|
|
- Version 0.10 was released in February 2026.
|
|
|
|
See the [CHANGELOG](https://github.com/rust-random/rand/blob/master/CHANGELOG.md) or [Upgrade Guide](https://rust-random.github.io/book/update.html) for more details.
|
|
|
|
## Crate Features
|
|
|
|
Rand is built with these features enabled by default:
|
|
|
|
- `std` enables functionality dependent on the `std` lib
|
|
- `alloc` (implied by `std`) enables functionality requiring an allocator; a
|
|
significant portion of sequence and distribution functionality requires this
|
|
- `sys_rng` enables `rand::rngs::SysRng` (uses the [getrandom] crate)
|
|
- `std_rng` enables `rand::rngs::StdRng` (uses the [chacha20] crate)
|
|
- `thread_rng` (implies `std`, `std_rng`, `sys_rng`) enables `rand::rngs::ThreadRng` and `rand::rng()`
|
|
|
|
Optionally, the following dependencies can be enabled:
|
|
|
|
- `chacha` enables `rand::rngs::{ChaCha8Rng, ChaCha12Rng, ChaCha20Rng}` (uses the [chacha20] crate)
|
|
|
|
Additionally, these features configure Rand:
|
|
|
|
- `simd_support` (experimental) enables sampling of SIMD values (uniformly
|
|
random SIMD integers and floats). Since `std::simd` is not yet stable this
|
|
feature requires nightly Rust and may cause build failures.
|
|
- `unbiased` use unbiased sampling for algorithms supporting this option: Uniform distribution.
|
|
|
|
(By default, bias affecting no more than one in 2^48 samples is accepted.)
|
|
|
|
Note: enabling this option is expected to affect reproducibility of results.
|
|
|
|
## Portability
|
|
|
|
### Reproducibility
|
|
|
|
Achieving reproducible results requires not only deterministic algorithms with fixed inputs but also a commitment to stability of algorithms and some platform-specific considerations. A subset of `rand` does aim to support reproducibility; read more about this in the book: [Portability](https://rust-random.github.io/book/portability.html).
|
|
|
|
### WebAssembly support
|
|
|
|
The [WASI](https://github.com/WebAssembly/WASI/tree/main) and Emscripten
|
|
targets are directly supported. The `wasm32-unknown-unknown` target is not
|
|
*automatically* supported. To enable support for this target, refer to the
|
|
[`getrandom` documentation for WebAssembly](https://docs.rs/getrandom/latest/getrandom/#webassembly-support).
|
|
Alternatively, the `sys_rng` feature may be disabled.
|
|
|
|
# License
|
|
|
|
Rand is distributed under the terms of both the MIT license and the
|
|
Apache License (Version 2.0).
|
|
|
|
See [LICENSE-APACHE](https://github.com/rust-random/rand/blob/master/LICENSE-APACHE) and [LICENSE-MIT](https://github.com/rust-random/rand/blob/master/LICENSE-MIT), and
|
|
[COPYRIGHT](https://github.com/rust-random/rand/blob/master/COPYRIGHT) for details.
|
|
|
|
[getrandom]: https://crates.io/crates/getrandom
|
|
[chacha20]: https://crates.io/crates/chacha20
|