2018-03-25 10:40:31 +02:00
|
|
|
# Rand
|
|
|
|
|
|
|
|
[](https://travis-ci.org/rust-lang-nursery/rand)
|
|
|
|
[](https://ci.appveyor.com/project/alexcrichton/rand)
|
2018-03-27 10:44:20 +02:00
|
|
|
[](https://crates.io/crates/rand)
|
|
|
|
[](https://docs.rs/rand)
|
|
|
|
[](https://github.com/rust-lang-nursery/rand#rust-version-requirements)
|
2015-02-03 16:57:35 +11:00
|
|
|
|
|
|
|
A Rust library for random number generators and other randomness functionality.
|
|
|
|
|
2018-03-23 15:37:31 +00:00
|
|
|
See also:
|
|
|
|
|
|
|
|
* [rand_core](https://crates.io/crates/rand_core)
|
|
|
|
|
2018-03-24 17:40:58 +00:00
|
|
|
Documentation:
|
|
|
|
[master branch](https://rust-lang-nursery.github.io/rand/rand/index.html),
|
|
|
|
[by release](https://docs.rs/rand)
|
2015-02-03 16:57:35 +11:00
|
|
|
|
|
|
|
## Usage
|
|
|
|
|
|
|
|
Add this to your `Cargo.toml`:
|
|
|
|
|
|
|
|
```toml
|
|
|
|
[dependencies]
|
2018-04-22 10:07:53 +01:00
|
|
|
rand = "0.5.0-pre.1"
|
2015-02-03 16:57:35 +11:00
|
|
|
```
|
|
|
|
|
|
|
|
and this to your crate root:
|
|
|
|
|
|
|
|
```rust
|
|
|
|
extern crate rand;
|
2018-03-24 12:13:27 +00:00
|
|
|
|
|
|
|
// example usage:
|
|
|
|
use rand::{Rng, thread_rng};
|
|
|
|
let x: f64 = thread_rng().gen();
|
2015-02-03 16:57:35 +11:00
|
|
|
```
|
2015-12-10 10:41:58 -05:00
|
|
|
|
2018-03-11 12:07:24 +00:00
|
|
|
## Versions
|
2017-12-11 16:39:13 +00:00
|
|
|
|
2018-03-27 12:24:23 +01:00
|
|
|
Version 0.5 is available as a pre-release and contains many breaking changes.
|
|
|
|
See [the Upgrade Guide](UPDATING.md) for guidance on updating from previous
|
|
|
|
versions.
|
2018-01-02 14:35:06 +00:00
|
|
|
|
2018-03-11 12:07:24 +00:00
|
|
|
Version 0.4 was released in December 2017. It contains almost no breaking
|
|
|
|
changes since the 0.3 series.
|
|
|
|
|
|
|
|
For more details, see the [changelog](CHANGELOG.md).
|
|
|
|
|
2018-03-27 12:24:23 +01:00
|
|
|
### Compatibility shims
|
|
|
|
|
|
|
|
**As of now there is no compatibility shim between Rand 0.4 and 0.5.**
|
|
|
|
It is also not entirely obvious how to make one due to the large differences
|
|
|
|
between the two versions, although it would be possible to implement the new
|
|
|
|
`RngCore` for any implementation of the old `Rng` (or vice-versa; unfortunately
|
|
|
|
not both as that would result in circular implementation). If we implement a
|
|
|
|
compatibility shim it will be optional (opt-in via a feature).
|
|
|
|
|
|
|
|
There is a compatibility shim from 0.3 to 0.4 forcibly upgrading all Rand 0.3
|
|
|
|
users; this is largely due to the small differences between the two versions.
|
|
|
|
|
2018-03-11 12:07:24 +00:00
|
|
|
### Rust version requirements
|
|
|
|
|
|
|
|
The 0.5 release of Rand will require **Rustc version 1.22 or greater**.
|
|
|
|
Rand 0.4 and 0.3 (since approx. June 2017) require Rustc version 1.15 or
|
|
|
|
greater. Subsets of the Rand code may work with older Rust versions, but this
|
|
|
|
is not supported.
|
|
|
|
|
|
|
|
Travis CI always has a build with a pinned version of Rustc matching the oldest
|
|
|
|
supported Rust release. The current policy is that this can be updated in any
|
|
|
|
Rand release if required, but the change must be noted in the changelog.
|
2017-12-11 16:39:13 +00:00
|
|
|
|
2018-03-23 15:37:31 +00:00
|
|
|
## Functionality
|
2015-12-10 10:41:58 -05:00
|
|
|
|
2018-03-23 15:37:31 +00:00
|
|
|
The `rand_core` crate provides:
|
2015-12-10 10:41:58 -05:00
|
|
|
|
2018-03-23 15:37:31 +00:00
|
|
|
- base random number generator traits
|
|
|
|
- error-reporting types
|
|
|
|
- functionality to aid implementation of RNGs
|
2015-12-10 10:41:58 -05:00
|
|
|
|
2018-03-23 15:37:31 +00:00
|
|
|
The `rand` crate provides:
|
2015-12-10 10:41:58 -05:00
|
|
|
|
2018-03-23 15:37:31 +00:00
|
|
|
- most content from `rand_core` (re-exported)
|
|
|
|
- fresh entropy: `EntropyRng`, `OsRng`, `JitterRng`
|
|
|
|
- pseudo-random number generators: `StdRng`, `SmallRng`, `prng` module
|
|
|
|
- convenient, auto-seeded crypto-grade thread-local generator: `thread_rng`
|
|
|
|
- `distributions` producing many different types of random values:
|
2018-04-02 10:29:11 +02:00
|
|
|
- a `Standard` distribution for integers, floats,and derived types
|
|
|
|
including tuples, arrays and `Option`
|
2018-03-23 15:37:31 +00:00
|
|
|
- unbiased sampling from specified `Range`s
|
|
|
|
- sampling from exponential/normal/gamma distributions
|
|
|
|
- sampling from binomial/poisson distributions
|
|
|
|
- `gen_bool` aka Bernoulli distribution
|
|
|
|
- `seq`-uence related functionality:
|
|
|
|
- sampling a subset of elements
|
|
|
|
- randomly shuffling a list
|
2015-12-10 10:41:58 -05:00
|
|
|
|
2018-03-23 15:37:31 +00:00
|
|
|
## Crate Features
|
2017-12-14 16:36:28 +00:00
|
|
|
|
2018-03-11 12:07:24 +00:00
|
|
|
By default, Rand is built with all stable features available. The following
|
2017-12-14 16:36:28 +00:00
|
|
|
optional features are available:
|
|
|
|
|
2018-01-26 14:59:23 +00:00
|
|
|
- `alloc` can be used instead of `std` to provide `Vec` and `Box`
|
2017-12-14 16:36:28 +00:00
|
|
|
- `i128_support` enables support for generating `u128` and `i128` values
|
2018-01-26 14:59:23 +00:00
|
|
|
- `log` enables some logging via the `log` crate
|
2017-12-14 16:36:28 +00:00
|
|
|
- `nightly` enables all unstable features (`i128_support`)
|
2018-04-03 13:17:41 +02:00
|
|
|
- `serde1` enables serialization for some types, via Serde version 1
|
2018-03-26 11:45:00 +02:00
|
|
|
- `stdweb` enables support for `OsRng` on WASM via stdweb.
|
2017-12-14 16:36:28 +00:00
|
|
|
- `std` enabled by default; by setting "default-features = false" `no_std`
|
|
|
|
mode is activated; this removes features depending on `std` functionality:
|
2018-01-26 14:59:23 +00:00
|
|
|
- `OsRng` is entirely unavailable
|
|
|
|
- `JitterRng` code is still present, but a nanosecond timer must be
|
|
|
|
provided via `JitterRng::new_with_timer`
|
|
|
|
- Since no external entropy is available, it is not possible to create
|
|
|
|
generators with fresh seeds (user must provide entropy)
|
|
|
|
- `thread_rng`, `weak_rng` and `random` are all disabled
|
|
|
|
- exponential, normal and gamma type distributions are unavailable
|
|
|
|
since `exp` and `log` functions are not provided in `core`
|
|
|
|
- any code requiring `Vec` or `Box`
|
2017-12-14 16:36:28 +00:00
|
|
|
|
|
|
|
## Testing
|
|
|
|
|
|
|
|
Unfortunately, `cargo test` does not test everything. The following tests are
|
|
|
|
recommended:
|
|
|
|
|
|
|
|
```
|
2018-03-11 12:07:24 +00:00
|
|
|
# Basic tests for Rand and sub-crates
|
2017-12-14 16:36:28 +00:00
|
|
|
cargo test --all
|
|
|
|
|
2018-02-15 11:12:45 +00:00
|
|
|
# Test no_std support
|
|
|
|
cargo test --tests --no-default-features
|
|
|
|
# Test no_std+alloc support
|
|
|
|
cargo test --tests --no-default-features --features alloc
|
|
|
|
|
|
|
|
# Test log and serde support
|
2018-04-03 13:17:41 +02:00
|
|
|
cargo test --features serde1,log
|
2017-12-14 16:36:28 +00:00
|
|
|
|
|
|
|
# Test 128-bit support (requires nightly)
|
|
|
|
cargo test --all --features nightly
|
|
|
|
|
|
|
|
# Benchmarks (requires nightly)
|
|
|
|
cargo bench
|
|
|
|
# or just to test the benchmark code:
|
|
|
|
cargo test --benches
|
|
|
|
```
|
|
|
|
|
2017-06-14 12:22:22 -07:00
|
|
|
|
|
|
|
# License
|
|
|
|
|
2018-03-11 12:07:24 +00:00
|
|
|
Rand is distributed under the terms of both the MIT
|
2017-10-05 16:12:50 -07:00
|
|
|
license and the Apache License (Version 2.0).
|
2017-06-14 12:22:22 -07:00
|
|
|
|
2018-03-11 12:07:24 +00:00
|
|
|
See [LICENSE-APACHE](LICENSE-APACHE) and [LICENSE-MIT](LICENSE-MIT) for details.
|