Rand is a set of crates supporting (pseudo-)random generators:
- Built over a standard RNG trait:
rand_core::RngCore - With fast implementations of both strong and
small generators:
rand::rngs, and more RNGs:rand_chacha,rand_xoshiro,rand_pcg, rngs repo rand::rngis an asymptotically-fast, automatically-seeded and reasonably strong generator available on allstdtargets- Direct support for seeding generators from the getrandom crate
With broad support for random value generation and random processes:
StandardUniformrandom value sampling,Uniform-ranged value sampling and more- Samplers for a large number of non-uniform random number distributions via our own
rand_distrand via thestatrs - Random processes (mostly choose and shuffle) via
rand::seqtraits
All with:
- Portably reproducible output
#[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
randandrand_distreach 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 and oorandom.
- Primarily a cryptographic library.
randdoes provide some generators which aim to support unpredictable value generation under certain constraints; see SECURITY.md for details. Users are expected to determine for themselves whetherrand's functionality meets their own security requirements.
Documentation:
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.9 was released in January 2025.
See the CHANGELOG or Upgrade Guide for more details.
Rand is built with these features enabled by default:
stdenables functionality dependent on thestdliballoc(implied bystd) enables functionality requiring an allocatorsys_rng(implied bystd) enablesrngs::SysRng, using the getrandom cratestd_rngenables inclusion ofStdRng,ThreadRng
Optionally, the following dependencies can be enabled:
logenables logging via log
Additionally, these features configure Rand:
-
simd_support(experimental) enables sampling of SIMD values (uniformly random SIMD integers and floats). Sincestd::simdis not yet stable this feature requires nightly Rust and may cause build failures. -
unbiaseduse 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.
Rand supports limited functionality in no_std mode (enabled via
default-features = false). In this case, SysRng is
unavailable (unless sys_rng is enabled), large parts of seq are
unavailable (unless alloc is enabled), and ThreadRng is unavailable.
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.
The WASI 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.
Alternatively, the sys_rng feature may be disabled.
Rand is distributed under the terms of both the MIT license and the Apache License (Version 2.0).
See LICENSE-APACHE and LICENSE-MIT, and COPYRIGHT for details.