2018-03-25 10:40:31 +02:00
|
|
|
# Rand
|
|
|
|
|
2018-08-13 18:00:37 +01:00
|
|
|
[](https://travis-ci.org/rust-random/rand)
|
|
|
|
[](https://ci.appveyor.com/project/dhardy/rand)
|
2018-03-27 10:44:20 +02:00
|
|
|
[](https://crates.io/crates/rand)
|
|
|
|
[](https://docs.rs/rand)
|
2018-08-13 18:00:37 +01:00
|
|
|
[](https://github.com/rust-random/rand#rust-version-requirements)
|
|
|
|
[](https://github.com/rust-random/rand#license)
|
2015-02-03 16:57:35 +11:00
|
|
|
|
2018-05-11 10:42:10 +02:00
|
|
|
A Rust library for random number generation.
|
2015-02-03 16:57:35 +11:00
|
|
|
|
2018-05-11 10:42:10 +02:00
|
|
|
Rand provides utilities to generate random numbers, to convert them to useful
|
|
|
|
types and distributions, and some randomness-related algorithms.
|
2018-03-23 15:37:31 +00:00
|
|
|
|
2018-05-11 12:31:17 +02:00
|
|
|
The core random number generation traits of Rand live in the [rand_core](
|
|
|
|
https://crates.io/crates/rand_core) crate; this crate is most useful when
|
|
|
|
implementing RNGs.
|
2018-03-23 15:37:31 +00:00
|
|
|
|
2018-07-09 18:15:13 +01:00
|
|
|
Documentation:
|
|
|
|
- [API reference for latest release](https://docs.rs/rand/0.5)
|
2018-08-13 18:00:37 +01:00
|
|
|
- [API reference for master branch](https://rust-random.github.io/rand/rand/index.html)
|
2018-07-09 18:15:13 +01:00
|
|
|
- [Additional documentation (subdir)](doc/README.md)
|
|
|
|
|
2015-02-03 16:57:35 +11:00
|
|
|
|
|
|
|
## Usage
|
|
|
|
|
|
|
|
Add this to your `Cargo.toml`:
|
|
|
|
|
|
|
|
```toml
|
|
|
|
[dependencies]
|
2018-05-21 15:18:37 +02:00
|
|
|
rand = "0.5"
|
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
|
|
|
|
2018-05-11 10:42:10 +02:00
|
|
|
use rand::prelude::*;
|
|
|
|
|
2018-05-26 16:14:23 +03:00
|
|
|
fn main() {
|
|
|
|
// basic usage with random():
|
|
|
|
let x: u8 = random();
|
|
|
|
println!("{}", x);
|
|
|
|
|
|
|
|
let y = random::<f64>();
|
|
|
|
println!("{}", y);
|
|
|
|
|
|
|
|
if random() { // generates a boolean
|
|
|
|
println!("Heads!");
|
|
|
|
}
|
|
|
|
|
|
|
|
// normal usage needs both an RNG and a function to generate the appropriate
|
|
|
|
// type, range, distribution, etc.
|
|
|
|
let mut rng = thread_rng();
|
|
|
|
if rng.gen() { // random bool
|
2018-06-01 11:13:56 +02:00
|
|
|
let x: f64 = rng.gen(); // random number in range [0, 1)
|
2018-05-26 16:14:23 +03:00
|
|
|
println!("x is: {}", x);
|
|
|
|
let ch = rng.gen::<char>(); // Sometimes you need type annotation
|
|
|
|
println!("char is: {}", ch);
|
|
|
|
println!("Number from 0 to 9: {}", rng.gen_range(0, 10));
|
|
|
|
}
|
2018-05-11 10:42:10 +02:00
|
|
|
}
|
2015-02-03 16:57:35 +11:00
|
|
|
```
|
2015-12-10 10:41:58 -05:00
|
|
|
|
2018-05-11 10:42:10 +02:00
|
|
|
## Functionality
|
|
|
|
|
|
|
|
The Rand crate provides:
|
|
|
|
|
|
|
|
- A convenient to use default RNG, `thread_rng`: an automatically seeded,
|
|
|
|
crypto-grade generator stored in thread-local memory.
|
|
|
|
- Pseudo-random number generators: `StdRng`, `SmallRng`, `prng` module.
|
|
|
|
- Functionality for seeding PRNGs: the `FromEntropy` trait, and as sources of
|
|
|
|
external randomness `EntropyRng`, `OsRng` and `JitterRng`.
|
2018-05-11 12:31:17 +02:00
|
|
|
- Most content from [`rand_core`](https://crates.io/crates/rand_core)
|
|
|
|
(re-exported): base random number generator traits and error-reporting types.
|
2018-05-11 10:42:10 +02:00
|
|
|
- 'Distributions' producing many different types of random values:
|
|
|
|
- A `Standard` distribution for integers, floats, and derived types including
|
|
|
|
tuples, arrays and `Option`
|
|
|
|
- Unbiased sampling from specified `Uniform` ranges.
|
|
|
|
- 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.
|
|
|
|
|
|
|
|
|
2018-03-11 12:07:24 +00:00
|
|
|
## Versions
|
2017-12-11 16:39:13 +00:00
|
|
|
|
2018-05-11 12:31:17 +02:00
|
|
|
Version 0.5 is the latest version and contains many breaking changes.
|
2018-03-27 12:24:23 +01:00
|
|
|
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).
|
|
|
|
|
|
|
|
### Rust version requirements
|
|
|
|
|
2018-05-11 12:31:17 +02:00
|
|
|
The 0.5 release of Rand requires **Rustc version 1.22 or greater**.
|
2018-03-11 12:07:24 +00:00
|
|
|
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
|
|
|
|
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-06-01 23:42:40 +02:00
|
|
|
Rand is built with only the `std` feature enabled by default. The following
|
2017-12-14 16:36:28 +00:00
|
|
|
optional features are available:
|
|
|
|
|
2018-05-11 10:42:10 +02:00
|
|
|
- `alloc` can be used instead of `std` to provide `Vec` and `Box`.
|
|
|
|
- `log` enables some logging via the `log` crate.
|
2018-07-27 16:05:48 +02:00
|
|
|
- `nightly` enables all unstable features (`simd_support`).
|
2018-05-11 10:42:10 +02:00
|
|
|
- `serde1` enables serialization for some types, via Serde version 1.
|
2018-07-26 12:35:36 +02:00
|
|
|
- `simd_support` enables uniform sampling of SIMD types (integers and floats).
|
2018-07-05 22:12:57 -07:00
|
|
|
- `stdweb` enables support for `OsRng` on `wasm32-unknown-unknown` via `stdweb`
|
2018-05-30 09:26:13 +02:00
|
|
|
combined with `cargo-web`.
|
2018-07-05 22:12:57 -07:00
|
|
|
- `wasm-bindgen` enables support for `OsRng` on `wasm32-unknown-unknown` via
|
|
|
|
[`wasm-bindgen`]
|
|
|
|
|
|
|
|
[`wasm-bindgen`]: https://github.com/rustwasm/wasm-bindgen
|
2018-05-11 10:42:10 +02:00
|
|
|
|
|
|
|
`no_std` mode is activated by setting `default-features = false`; this removes
|
|
|
|
functionality depending on `std`:
|
|
|
|
|
|
|
|
- `thread_rng()`, and `random()` are not available, as they require thread-local
|
2018-05-11 12:31:17 +02:00
|
|
|
storage and an entropy source.
|
|
|
|
- `OsRng` and `EntropyRng` are unavailable.
|
2018-05-11 10:42:10 +02:00
|
|
|
- `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 using the `FromEntropy` trait (user must provide
|
|
|
|
a seed).
|
|
|
|
- Exponential, normal and gamma type distributions are unavailable since `exp`
|
|
|
|
and `log` functions are not provided in `core`.
|
|
|
|
- The `seq`-uence module is unavailable, as it requires `Vec`.
|
2017-12-14 16:36:28 +00:00
|
|
|
|
2017-06-14 12:22:22 -07:00
|
|
|
|
|
|
|
# License
|
|
|
|
|
2018-05-11 10:42:10 +02:00
|
|
|
Rand is distributed under the terms of both the MIT 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.
|