2684 lines
61 KiB
Markdown
2684 lines
61 KiB
Markdown
|
|
# Crate Documentation
|
||
|
|
|
||
|
|
**Version:** 0.9.2
|
||
|
|
|
||
|
|
**Format Version:** 54
|
||
|
|
|
||
|
|
# Module `rand`
|
||
|
|
|
||
|
|
Utilities for random number generation
|
||
|
|
|
||
|
|
Rand provides utilities to generate random numbers, to convert them to
|
||
|
|
useful types and distributions, and some randomness-related algorithms.
|
||
|
|
|
||
|
|
# Quick Start
|
||
|
|
|
||
|
|
```
|
||
|
|
// The prelude import enables methods we use below, specifically
|
||
|
|
// Rng::random, Rng::sample, SliceRandom::shuffle and IndexedRandom::choose.
|
||
|
|
use rand::prelude::*;
|
||
|
|
|
||
|
|
// Get an RNG:
|
||
|
|
let mut rng = rand::rng();
|
||
|
|
|
||
|
|
// Try printing a random unicode code point (probably a bad idea)!
|
||
|
|
println!("char: '{}'", rng.random::<char>());
|
||
|
|
// Try printing a random alphanumeric value instead!
|
||
|
|
println!("alpha: '{}'", rng.sample(rand::distr::Alphanumeric) as char);
|
||
|
|
|
||
|
|
// Generate and shuffle a sequence:
|
||
|
|
let mut nums: Vec<i32> = (1..100).collect();
|
||
|
|
nums.shuffle(&mut rng);
|
||
|
|
// And take a random pick (yes, we didn't need to shuffle first!):
|
||
|
|
let _ = nums.choose(&mut rng);
|
||
|
|
```
|
||
|
|
|
||
|
|
# The Book
|
||
|
|
|
||
|
|
For the user guide and further documentation, please read
|
||
|
|
[The Rust Rand Book](https://rust-random.github.io/book).
|
||
|
|
|
||
|
|
## Modules
|
||
|
|
|
||
|
|
## Module `distr`
|
||
|
|
|
||
|
|
Generating random samples from probability distributions
|
||
|
|
|
||
|
|
This module is the home of the [`Distribution`] trait and several of its
|
||
|
|
implementations. It is the workhorse behind some of the convenient
|
||
|
|
functionality of the [`Rng`] trait, e.g. [`Rng::random`] and of course
|
||
|
|
[`Rng::sample`].
|
||
|
|
|
||
|
|
Abstractly, a [probability distribution] describes the probability of
|
||
|
|
occurrence of each value in its sample space.
|
||
|
|
|
||
|
|
More concretely, an implementation of `Distribution<T>` for type `X` is an
|
||
|
|
algorithm for choosing values from the sample space (a subset of `T`)
|
||
|
|
according to the distribution `X` represents, using an external source of
|
||
|
|
randomness (an RNG supplied to the `sample` function).
|
||
|
|
|
||
|
|
A type `X` may implement `Distribution<T>` for multiple types `T`.
|
||
|
|
Any type implementing [`Distribution`] is stateless (i.e. immutable),
|
||
|
|
but it may have internal parameters set at construction time (for example,
|
||
|
|
[`Uniform`] allows specification of its sample space as a range within `T`).
|
||
|
|
|
||
|
|
|
||
|
|
# The Standard Uniform distribution
|
||
|
|
|
||
|
|
The [`StandardUniform`] distribution is important to mention. This is the
|
||
|
|
distribution used by [`Rng::random`] and represents the "default" way to
|
||
|
|
produce a random value for many different types, including most primitive
|
||
|
|
types, tuples, arrays, and a few derived types. See the documentation of
|
||
|
|
[`StandardUniform`] for more details.
|
||
|
|
|
||
|
|
Implementing [`Distribution<T>`] for [`StandardUniform`] for user types `T` makes it
|
||
|
|
possible to generate type `T` with [`Rng::random`], and by extension also
|
||
|
|
with the [`random`] function.
|
||
|
|
|
||
|
|
## Other standard uniform distributions
|
||
|
|
|
||
|
|
[`Alphanumeric`] is a simple distribution to sample random letters and
|
||
|
|
numbers of the `char` type; in contrast [`StandardUniform`] may sample any valid
|
||
|
|
`char`.
|
||
|
|
|
||
|
|
There's also an [`Alphabetic`] distribution which acts similarly to [`Alphanumeric`] but
|
||
|
|
doesn't include digits.
|
||
|
|
|
||
|
|
For floats (`f32`, `f64`), [`StandardUniform`] samples from `[0, 1)`. Also
|
||
|
|
provided are [`Open01`] (samples from `(0, 1)`) and [`OpenClosed01`]
|
||
|
|
(samples from `(0, 1]`). No option is provided to sample from `[0, 1]`; it
|
||
|
|
is suggested to use one of the above half-open ranges since the failure to
|
||
|
|
sample a value which would have a low chance of being sampled anyway is
|
||
|
|
rarely an issue in practice.
|
||
|
|
|
||
|
|
# Parameterized Uniform distributions
|
||
|
|
|
||
|
|
The [`Uniform`] distribution provides uniform sampling over a specified
|
||
|
|
range on a subset of the types supported by the above distributions.
|
||
|
|
|
||
|
|
Implementations support single-value-sampling via
|
||
|
|
[`Rng::random_range(Range)`](Rng::random_range).
|
||
|
|
Where a fixed (non-`const`) range will be sampled many times, it is likely
|
||
|
|
faster to pre-construct a [`Distribution`] object using
|
||
|
|
[`Uniform::new`], [`Uniform::new_inclusive`] or `From<Range>`.
|
||
|
|
|
||
|
|
# Non-uniform sampling
|
||
|
|
|
||
|
|
Sampling a simple true/false outcome with a given probability has a name:
|
||
|
|
the [`Bernoulli`] distribution (this is used by [`Rng::random_bool`]).
|
||
|
|
|
||
|
|
For weighted sampling of discrete values see the [`weighted`] module.
|
||
|
|
|
||
|
|
This crate no longer includes other non-uniform distributions; instead
|
||
|
|
it is recommended that you use either [`rand_distr`] or [`statrs`].
|
||
|
|
|
||
|
|
|
||
|
|
[probability distribution]: https://en.wikipedia.org/wiki/Probability_distribution
|
||
|
|
[`rand_distr`]: https://crates.io/crates/rand_distr
|
||
|
|
[`statrs`]: https://crates.io/crates/statrs
|
||
|
|
[`random`]: crate::random
|
||
|
|
[`rand_distr`]: https://crates.io/crates/rand_distr
|
||
|
|
[`statrs`]: https://crates.io/crates/statrs
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub mod distr { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Modules
|
||
|
|
|
||
|
|
## Module `slice`
|
||
|
|
|
||
|
|
Distributions over slices
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub mod slice { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Types
|
||
|
|
|
||
|
|
#### Struct `Choose`
|
||
|
|
|
||
|
|
A distribution to uniformly sample elements of a slice
|
||
|
|
|
||
|
|
Like [`IndexedRandom::choose`], this uniformly samples elements of a slice
|
||
|
|
without modification of the slice (so called "sampling with replacement").
|
||
|
|
This distribution object may be a little faster for repeated sampling (but
|
||
|
|
slower for small numbers of samples).
|
||
|
|
|
||
|
|
## Examples
|
||
|
|
|
||
|
|
Since this is a distribution, [`Rng::sample_iter`] and
|
||
|
|
[`Distribution::sample_iter`] may be used, for example:
|
||
|
|
```
|
||
|
|
use rand::distr::{Distribution, slice::Choose};
|
||
|
|
|
||
|
|
let vowels = ['a', 'e', 'i', 'o', 'u'];
|
||
|
|
let vowels_dist = Choose::new(&vowels).unwrap();
|
||
|
|
|
||
|
|
// build a string of 10 vowels
|
||
|
|
let vowel_string: String = vowels_dist
|
||
|
|
.sample_iter(&mut rand::rng())
|
||
|
|
.take(10)
|
||
|
|
.collect();
|
||
|
|
|
||
|
|
println!("{}", vowel_string);
|
||
|
|
assert_eq!(vowel_string.len(), 10);
|
||
|
|
assert!(vowel_string.chars().all(|c| vowels.contains(&c)));
|
||
|
|
```
|
||
|
|
|
||
|
|
For a single sample, [`IndexedRandom::choose`] may be preferred:
|
||
|
|
```
|
||
|
|
use rand::seq::IndexedRandom;
|
||
|
|
|
||
|
|
let vowels = ['a', 'e', 'i', 'o', 'u'];
|
||
|
|
let mut rng = rand::rng();
|
||
|
|
|
||
|
|
println!("{}", vowels.choose(&mut rng).unwrap());
|
||
|
|
```
|
||
|
|
|
||
|
|
[`IndexedRandom::choose`]: crate::seq::IndexedRandom::choose
|
||
|
|
[`Rng::sample_iter`]: crate::Rng::sample_iter
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub struct Choose<''a, T> {
|
||
|
|
// Some fields omitted
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
##### Fields
|
||
|
|
|
||
|
|
| Name | Type | Documentation |
|
||
|
|
|------|------|---------------|
|
||
|
|
| *private fields* | ... | *Some fields have been omitted* |
|
||
|
|
|
||
|
|
##### Implementations
|
||
|
|
|
||
|
|
###### Methods
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
pub fn new(slice: &''a [T]) -> Result<Self, Empty> { /* ... */ }
|
||
|
|
```
|
||
|
|
Create a new `Choose` instance which samples uniformly from the slice.
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
pub fn num_choices(self: &Self) -> NonZeroUsize { /* ... */ }
|
||
|
|
```
|
||
|
|
Returns the count of choices in this distribution
|
||
|
|
|
||
|
|
###### Trait Implementations
|
||
|
|
|
||
|
|
- **Any**
|
||
|
|
- ```rust
|
||
|
|
fn type_id(self: &Self) -> TypeId { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Borrow**
|
||
|
|
- ```rust
|
||
|
|
fn borrow(self: &Self) -> &T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **BorrowMut**
|
||
|
|
- ```rust
|
||
|
|
fn borrow_mut(self: &mut Self) -> &mut T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Clone**
|
||
|
|
- ```rust
|
||
|
|
fn clone(self: &Self) -> Choose<''a, T> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **CloneToUninit**
|
||
|
|
- ```rust
|
||
|
|
unsafe fn clone_to_uninit(self: &Self, dest: *mut u8) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Copy**
|
||
|
|
- **Debug**
|
||
|
|
- ```rust
|
||
|
|
fn fmt(self: &Self, f: &mut $crate::fmt::Formatter<''_>) -> $crate::fmt::Result { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Distribution**
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: crate::Rng + ?Sized>(self: &Self, rng: &mut R) -> &''a T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Freeze**
|
||
|
|
- **From**
|
||
|
|
- ```rust
|
||
|
|
fn from(t: T) -> T { /* ... */ }
|
||
|
|
```
|
||
|
|
Returns the argument unchanged.
|
||
|
|
|
||
|
|
- **Into**
|
||
|
|
- ```rust
|
||
|
|
fn into(self: Self) -> U { /* ... */ }
|
||
|
|
```
|
||
|
|
Calls `U::from(self)`.
|
||
|
|
|
||
|
|
- **RefUnwindSafe**
|
||
|
|
- **SampleString**
|
||
|
|
- ```rust
|
||
|
|
fn append_string<R: crate::Rng + ?Sized>(self: &Self, rng: &mut R, string: &mut String, len: usize) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Send**
|
||
|
|
- **Sync**
|
||
|
|
- **ToOwned**
|
||
|
|
- ```rust
|
||
|
|
fn to_owned(self: &Self) -> T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn clone_into(self: &Self, target: &mut T) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **TryFrom**
|
||
|
|
- ```rust
|
||
|
|
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **TryInto**
|
||
|
|
- ```rust
|
||
|
|
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Unpin**
|
||
|
|
- **UnwindSafe**
|
||
|
|
- **VZip**
|
||
|
|
- ```rust
|
||
|
|
fn vzip(self: Self) -> V { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Struct `Empty`
|
||
|
|
|
||
|
|
Error: empty slice
|
||
|
|
|
||
|
|
This error is returned when [`Choose::new`] is given an empty slice.
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub struct Empty;
|
||
|
|
```
|
||
|
|
|
||
|
|
##### Implementations
|
||
|
|
|
||
|
|
###### Trait Implementations
|
||
|
|
|
||
|
|
- **Any**
|
||
|
|
- ```rust
|
||
|
|
fn type_id(self: &Self) -> TypeId { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Borrow**
|
||
|
|
- ```rust
|
||
|
|
fn borrow(self: &Self) -> &T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **BorrowMut**
|
||
|
|
- ```rust
|
||
|
|
fn borrow_mut(self: &mut Self) -> &mut T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Clone**
|
||
|
|
- ```rust
|
||
|
|
fn clone(self: &Self) -> Empty { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **CloneToUninit**
|
||
|
|
- ```rust
|
||
|
|
unsafe fn clone_to_uninit(self: &Self, dest: *mut u8) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Copy**
|
||
|
|
- **Debug**
|
||
|
|
- ```rust
|
||
|
|
fn fmt(self: &Self, f: &mut $crate::fmt::Formatter<''_>) -> $crate::fmt::Result { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Display**
|
||
|
|
- ```rust
|
||
|
|
fn fmt(self: &Self, f: &mut core::fmt::Formatter<''_>) -> core::fmt::Result { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Error**
|
||
|
|
- **Freeze**
|
||
|
|
- **From**
|
||
|
|
- ```rust
|
||
|
|
fn from(t: T) -> T { /* ... */ }
|
||
|
|
```
|
||
|
|
Returns the argument unchanged.
|
||
|
|
|
||
|
|
- **Into**
|
||
|
|
- ```rust
|
||
|
|
fn into(self: Self) -> U { /* ... */ }
|
||
|
|
```
|
||
|
|
Calls `U::from(self)`.
|
||
|
|
|
||
|
|
- **RefUnwindSafe**
|
||
|
|
- **Send**
|
||
|
|
- **Sync**
|
||
|
|
- **ToOwned**
|
||
|
|
- ```rust
|
||
|
|
fn to_owned(self: &Self) -> T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn clone_into(self: &Self, target: &mut T) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **ToString**
|
||
|
|
- ```rust
|
||
|
|
fn to_string(self: &Self) -> String { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **TryFrom**
|
||
|
|
- ```rust
|
||
|
|
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **TryInto**
|
||
|
|
- ```rust
|
||
|
|
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Unpin**
|
||
|
|
- **UnwindSafe**
|
||
|
|
- **VZip**
|
||
|
|
- ```rust
|
||
|
|
fn vzip(self: Self) -> V { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
## Module `uniform`
|
||
|
|
|
||
|
|
A distribution uniformly sampling numbers within a given range.
|
||
|
|
|
||
|
|
[`Uniform`] is the standard distribution to sample uniformly from a range;
|
||
|
|
e.g. `Uniform::new_inclusive(1, 6).unwrap()` can sample integers from 1 to 6, like a
|
||
|
|
standard die. [`Rng::random_range`] is implemented over [`Uniform`].
|
||
|
|
|
||
|
|
# Example usage
|
||
|
|
|
||
|
|
```
|
||
|
|
use rand::Rng;
|
||
|
|
use rand::distr::Uniform;
|
||
|
|
|
||
|
|
let mut rng = rand::rng();
|
||
|
|
let side = Uniform::new(-10.0, 10.0).unwrap();
|
||
|
|
|
||
|
|
// sample between 1 and 10 points
|
||
|
|
for _ in 0..rng.random_range(1..=10) {
|
||
|
|
// sample a point from the square with sides -10 - 10 in two dimensions
|
||
|
|
let (x, y) = (rng.sample(side), rng.sample(side));
|
||
|
|
println!("Point: {}, {}", x, y);
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
# Extending `Uniform` to support a custom type
|
||
|
|
|
||
|
|
To extend [`Uniform`] to support your own types, write a back-end which
|
||
|
|
implements the [`UniformSampler`] trait, then implement the [`SampleUniform`]
|
||
|
|
helper trait to "register" your back-end. See the `MyF32` example below.
|
||
|
|
|
||
|
|
At a minimum, the back-end needs to store any parameters needed for sampling
|
||
|
|
(e.g. the target range) and implement `new`, `new_inclusive` and `sample`.
|
||
|
|
Those methods should include an assertion to check the range is valid (i.e.
|
||
|
|
`low < high`). The example below merely wraps another back-end.
|
||
|
|
|
||
|
|
The `new`, `new_inclusive`, `sample_single` and `sample_single_inclusive`
|
||
|
|
functions use arguments of
|
||
|
|
type `SampleBorrow<X>` to support passing in values by reference or
|
||
|
|
by value. In the implementation of these functions, you can choose to
|
||
|
|
simply use the reference returned by [`SampleBorrow::borrow`], or you can choose
|
||
|
|
to copy or clone the value, whatever is appropriate for your type.
|
||
|
|
|
||
|
|
```
|
||
|
|
use rand::prelude::*;
|
||
|
|
use rand::distr::uniform::{Uniform, SampleUniform,
|
||
|
|
UniformSampler, UniformFloat, SampleBorrow, Error};
|
||
|
|
|
||
|
|
struct MyF32(f32);
|
||
|
|
|
||
|
|
#[derive(Clone, Copy, Debug)]
|
||
|
|
struct UniformMyF32(UniformFloat<f32>);
|
||
|
|
|
||
|
|
impl UniformSampler for UniformMyF32 {
|
||
|
|
type X = MyF32;
|
||
|
|
|
||
|
|
fn new<B1, B2>(low: B1, high: B2) -> Result<Self, Error>
|
||
|
|
where B1: SampleBorrow<Self::X> + Sized,
|
||
|
|
B2: SampleBorrow<Self::X> + Sized
|
||
|
|
{
|
||
|
|
UniformFloat::<f32>::new(low.borrow().0, high.borrow().0).map(UniformMyF32)
|
||
|
|
}
|
||
|
|
fn new_inclusive<B1, B2>(low: B1, high: B2) -> Result<Self, Error>
|
||
|
|
where B1: SampleBorrow<Self::X> + Sized,
|
||
|
|
B2: SampleBorrow<Self::X> + Sized
|
||
|
|
{
|
||
|
|
UniformFloat::<f32>::new_inclusive(low.borrow().0, high.borrow().0).map(UniformMyF32)
|
||
|
|
}
|
||
|
|
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X {
|
||
|
|
MyF32(self.0.sample(rng))
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
impl SampleUniform for MyF32 {
|
||
|
|
type Sampler = UniformMyF32;
|
||
|
|
}
|
||
|
|
|
||
|
|
let (low, high) = (MyF32(17.0f32), MyF32(22.0f32));
|
||
|
|
let uniform = Uniform::new(low, high).unwrap();
|
||
|
|
let x = uniform.sample(&mut rand::rng());
|
||
|
|
```
|
||
|
|
|
||
|
|
[`SampleUniform`]: crate::distr::uniform::SampleUniform
|
||
|
|
[`UniformSampler`]: crate::distr::uniform::UniformSampler
|
||
|
|
[`UniformInt`]: crate::distr::uniform::UniformInt
|
||
|
|
[`UniformFloat`]: crate::distr::uniform::UniformFloat
|
||
|
|
[`UniformDuration`]: crate::distr::uniform::UniformDuration
|
||
|
|
[`SampleBorrow::borrow`]: crate::distr::uniform::SampleBorrow::borrow
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub mod uniform { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Types
|
||
|
|
|
||
|
|
#### Enum `Error`
|
||
|
|
|
||
|
|
Error type returned from [`Uniform::new`] and `new_inclusive`.
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub enum Error {
|
||
|
|
EmptyRange,
|
||
|
|
NonFinite,
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
##### Variants
|
||
|
|
|
||
|
|
###### `EmptyRange`
|
||
|
|
|
||
|
|
`low > high`, or equal in case of exclusive range.
|
||
|
|
|
||
|
|
###### `NonFinite`
|
||
|
|
|
||
|
|
Input or range `high - low` is non-finite. Not relevant to integer types.
|
||
|
|
|
||
|
|
##### Implementations
|
||
|
|
|
||
|
|
###### Trait Implementations
|
||
|
|
|
||
|
|
- **Any**
|
||
|
|
- ```rust
|
||
|
|
fn type_id(self: &Self) -> TypeId { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Borrow**
|
||
|
|
- ```rust
|
||
|
|
fn borrow(self: &Self) -> &T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **BorrowMut**
|
||
|
|
- ```rust
|
||
|
|
fn borrow_mut(self: &mut Self) -> &mut T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Clone**
|
||
|
|
- ```rust
|
||
|
|
fn clone(self: &Self) -> Error { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **CloneToUninit**
|
||
|
|
- ```rust
|
||
|
|
unsafe fn clone_to_uninit(self: &Self, dest: *mut u8) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Copy**
|
||
|
|
- **Debug**
|
||
|
|
- ```rust
|
||
|
|
fn fmt(self: &Self, f: &mut $crate::fmt::Formatter<''_>) -> $crate::fmt::Result { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Display**
|
||
|
|
- ```rust
|
||
|
|
fn fmt(self: &Self, f: &mut fmt::Formatter<''_>) -> fmt::Result { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Eq**
|
||
|
|
- **Error**
|
||
|
|
- **Freeze**
|
||
|
|
- **From**
|
||
|
|
- ```rust
|
||
|
|
fn from(t: T) -> T { /* ... */ }
|
||
|
|
```
|
||
|
|
Returns the argument unchanged.
|
||
|
|
|
||
|
|
- **Into**
|
||
|
|
- ```rust
|
||
|
|
fn into(self: Self) -> U { /* ... */ }
|
||
|
|
```
|
||
|
|
Calls `U::from(self)`.
|
||
|
|
|
||
|
|
- **PartialEq**
|
||
|
|
- ```rust
|
||
|
|
fn eq(self: &Self, other: &Error) -> bool { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **RefUnwindSafe**
|
||
|
|
- **Send**
|
||
|
|
- **StructuralPartialEq**
|
||
|
|
- **Sync**
|
||
|
|
- **ToOwned**
|
||
|
|
- ```rust
|
||
|
|
fn to_owned(self: &Self) -> T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn clone_into(self: &Self, target: &mut T) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **ToString**
|
||
|
|
- ```rust
|
||
|
|
fn to_string(self: &Self) -> String { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **TryFrom**
|
||
|
|
- ```rust
|
||
|
|
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **TryInto**
|
||
|
|
- ```rust
|
||
|
|
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Unpin**
|
||
|
|
- **UnwindSafe**
|
||
|
|
- **VZip**
|
||
|
|
- ```rust
|
||
|
|
fn vzip(self: Self) -> V { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Struct `Uniform`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg_attr>(feature = \"serde\", derive(Serialize, Deserialize))]")`
|
||
|
|
- `Other("#[<cfg_attr>(feature = \"serde\",\nserde(bound(serialize = \"X::Sampler: Serialize\")))]")`
|
||
|
|
- `Other("#[serde(bound(serialize = \"X::Sampler: Serialize\"))]")`
|
||
|
|
- `Other("#[<cfg_attr>(feature = \"serde\",\nserde(bound(deserialize = \"X::Sampler: Deserialize<'de>\")))]")`
|
||
|
|
- `Other("#[serde(bound(deserialize = \"X::Sampler: Deserialize<'de>\"))]")`
|
||
|
|
|
||
|
|
Sample values uniformly between two bounds.
|
||
|
|
|
||
|
|
# Construction
|
||
|
|
|
||
|
|
[`Uniform::new`] and [`Uniform::new_inclusive`] construct a uniform
|
||
|
|
distribution sampling from the given `low` and `high` limits. `Uniform` may
|
||
|
|
also be constructed via [`TryFrom`] as in `Uniform::try_from(1..=6).unwrap()`.
|
||
|
|
|
||
|
|
Constructors may do extra work up front to allow faster sampling of multiple
|
||
|
|
values. Where only a single sample is required it is suggested to use
|
||
|
|
[`Rng::random_range`] or one of the `sample_single` methods instead.
|
||
|
|
|
||
|
|
When sampling from a constant range, many calculations can happen at
|
||
|
|
compile-time and all methods should be fast; for floating-point ranges and
|
||
|
|
the full range of integer types, this should have comparable performance to
|
||
|
|
the [`StandardUniform`](super::StandardUniform) distribution.
|
||
|
|
|
||
|
|
# Provided implementations
|
||
|
|
|
||
|
|
- `char` ([`UniformChar`]): samples a range over the implementation for `u32`
|
||
|
|
- `f32`, `f64` ([`UniformFloat`]): samples approximately uniformly within a
|
||
|
|
range; bias may be present in the least-significant bit of the significand
|
||
|
|
and the limits of the input range may be sampled even when an open
|
||
|
|
(exclusive) range is used
|
||
|
|
- Integer types ([`UniformInt`]) may show a small bias relative to the
|
||
|
|
expected uniform distribution of output. In the worst case, bias affects
|
||
|
|
1 in `2^n` samples where n is 56 (`i8` and `u8`), 48 (`i16` and `u16`), 96
|
||
|
|
(`i32` and `u32`), 64 (`i64` and `u64`), 128 (`i128` and `u128`).
|
||
|
|
The `unbiased` feature flag fixes this bias.
|
||
|
|
- `usize` ([`UniformUsize`]) is handled specially, using the `u32`
|
||
|
|
implementation where possible to enable portable results across 32-bit and
|
||
|
|
64-bit CPU architectures.
|
||
|
|
- `Duration` ([`UniformDuration`]): samples a range over the implementation
|
||
|
|
for `u32` or `u64`
|
||
|
|
- SIMD types (requires [`simd_support`] feature) like x86's [`__m128i`]
|
||
|
|
and `std::simd`'s [`u32x4`], [`f32x4`] and [`mask32x4`] types are
|
||
|
|
effectively arrays of integer or floating-point types. Each lane is
|
||
|
|
sampled independently from its own range, potentially with more efficient
|
||
|
|
random-bit-usage than would be achieved with sequential sampling.
|
||
|
|
|
||
|
|
# Example
|
||
|
|
|
||
|
|
```
|
||
|
|
use rand::distr::{Distribution, Uniform};
|
||
|
|
|
||
|
|
let between = Uniform::try_from(10..10000).unwrap();
|
||
|
|
let mut rng = rand::rng();
|
||
|
|
let mut sum = 0;
|
||
|
|
for _ in 0..1000 {
|
||
|
|
sum += between.sample(&mut rng);
|
||
|
|
}
|
||
|
|
println!("{}", sum);
|
||
|
|
```
|
||
|
|
|
||
|
|
For a single sample, [`Rng::random_range`] may be preferred:
|
||
|
|
|
||
|
|
```
|
||
|
|
use rand::Rng;
|
||
|
|
|
||
|
|
let mut rng = rand::rng();
|
||
|
|
println!("{}", rng.random_range(0..10));
|
||
|
|
```
|
||
|
|
|
||
|
|
[`new`]: Uniform::new
|
||
|
|
[`new_inclusive`]: Uniform::new_inclusive
|
||
|
|
[`Rng::random_range`]: Rng::random_range
|
||
|
|
[`__m128i`]: https://doc.rust-lang.org/core/arch/x86/struct.__m128i.html
|
||
|
|
[`u32x4`]: std::simd::u32x4
|
||
|
|
[`f32x4`]: std::simd::f32x4
|
||
|
|
[`mask32x4`]: std::simd::mask32x4
|
||
|
|
[`simd_support`]: https://github.com/rust-random/rand#crate-features
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub struct Uniform<X: SampleUniform>(/* private field */);
|
||
|
|
```
|
||
|
|
|
||
|
|
##### Fields
|
||
|
|
|
||
|
|
| Index | Type | Documentation |
|
||
|
|
|-------|------|---------------|
|
||
|
|
| 0 | `private` | *Private field* |
|
||
|
|
|
||
|
|
##### Implementations
|
||
|
|
|
||
|
|
###### Methods
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
pub fn new<B1, B2>(low: B1, high: B2) -> Result<Uniform<X>, Error>
|
||
|
|
where
|
||
|
|
B1: SampleBorrow<X> + Sized,
|
||
|
|
B2: SampleBorrow<X> + Sized { /* ... */ }
|
||
|
|
```
|
||
|
|
Create a new `Uniform` instance, which samples uniformly from the half
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
pub fn new_inclusive<B1, B2>(low: B1, high: B2) -> Result<Uniform<X>, Error>
|
||
|
|
where
|
||
|
|
B1: SampleBorrow<X> + Sized,
|
||
|
|
B2: SampleBorrow<X> + Sized { /* ... */ }
|
||
|
|
```
|
||
|
|
Create a new `Uniform` instance, which samples uniformly from the closed
|
||
|
|
|
||
|
|
###### Trait Implementations
|
||
|
|
|
||
|
|
- **Any**
|
||
|
|
- ```rust
|
||
|
|
fn type_id(self: &Self) -> TypeId { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Borrow**
|
||
|
|
- ```rust
|
||
|
|
fn borrow(self: &Self) -> &T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **BorrowMut**
|
||
|
|
- ```rust
|
||
|
|
fn borrow_mut(self: &mut Self) -> &mut T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Clone**
|
||
|
|
- ```rust
|
||
|
|
fn clone(self: &Self) -> Uniform<X> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **CloneToUninit**
|
||
|
|
- ```rust
|
||
|
|
unsafe fn clone_to_uninit(self: &Self, dest: *mut u8) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Copy**
|
||
|
|
- **Debug**
|
||
|
|
- ```rust
|
||
|
|
fn fmt(self: &Self, f: &mut $crate::fmt::Formatter<''_>) -> $crate::fmt::Result { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Deserialize**
|
||
|
|
- ```rust
|
||
|
|
fn deserialize<__D>(__deserializer: __D) -> _serde::__private::Result<Self, <__D as >::Error>
|
||
|
|
where
|
||
|
|
__D: _serde::Deserializer<''de> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **DeserializeOwned**
|
||
|
|
- **Distribution**
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> X { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Eq**
|
||
|
|
- **Freeze**
|
||
|
|
- **From**
|
||
|
|
- ```rust
|
||
|
|
fn from(t: T) -> T { /* ... */ }
|
||
|
|
```
|
||
|
|
Returns the argument unchanged.
|
||
|
|
|
||
|
|
- **Into**
|
||
|
|
- ```rust
|
||
|
|
fn into(self: Self) -> U { /* ... */ }
|
||
|
|
```
|
||
|
|
Calls `U::from(self)`.
|
||
|
|
|
||
|
|
- **PartialEq**
|
||
|
|
- ```rust
|
||
|
|
fn eq(self: &Self, other: &Uniform<X>) -> bool { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **RefUnwindSafe**
|
||
|
|
- **SampleString**
|
||
|
|
- ```rust
|
||
|
|
fn append_string<R: Rng + ?Sized>(self: &Self, rng: &mut R, string: &mut alloc::string::String, len: usize) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Send**
|
||
|
|
- **Serialize**
|
||
|
|
- ```rust
|
||
|
|
fn serialize<__S>(self: &Self, __serializer: __S) -> _serde::__private::Result<<__S as >::Ok, <__S as >::Error>
|
||
|
|
where
|
||
|
|
__S: _serde::Serializer { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **StructuralPartialEq**
|
||
|
|
- **Sync**
|
||
|
|
- **ToOwned**
|
||
|
|
- ```rust
|
||
|
|
fn to_owned(self: &Self) -> T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn clone_into(self: &Self, target: &mut T) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **TryFrom**
|
||
|
|
- ```rust
|
||
|
|
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn try_from(r: Range<X>) -> Result<Uniform<X>, Error> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn try_from(r: ::core::ops::RangeInclusive<X>) -> Result<Uniform<X>, Error> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **TryInto**
|
||
|
|
- ```rust
|
||
|
|
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Unpin**
|
||
|
|
- **UnwindSafe**
|
||
|
|
- **VZip**
|
||
|
|
- ```rust
|
||
|
|
fn vzip(self: Self) -> V { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Traits
|
||
|
|
|
||
|
|
#### Trait `SampleUniform`
|
||
|
|
|
||
|
|
Helper trait for creating objects using the correct implementation of
|
||
|
|
[`UniformSampler`] for the sampling type.
|
||
|
|
|
||
|
|
See the [module documentation] on how to implement [`Uniform`] range
|
||
|
|
sampling for a custom type.
|
||
|
|
|
||
|
|
[module documentation]: crate::distr::uniform
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub trait SampleUniform: Sized {
|
||
|
|
/* Associated items */
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
> This trait is not object-safe and cannot be used in dynamic trait objects.
|
||
|
|
|
||
|
|
##### Required Items
|
||
|
|
|
||
|
|
###### Associated Types
|
||
|
|
|
||
|
|
- `Sampler`: The `UniformSampler` implementation supporting type `X`.
|
||
|
|
|
||
|
|
##### Implementations
|
||
|
|
|
||
|
|
This trait is implemented for the following types:
|
||
|
|
|
||
|
|
- `f32`
|
||
|
|
- `f64`
|
||
|
|
- `f32x2`
|
||
|
|
- `f32x4`
|
||
|
|
- `f32x8`
|
||
|
|
- `f32x16`
|
||
|
|
- `f64x2`
|
||
|
|
- `f64x4`
|
||
|
|
- `f64x8`
|
||
|
|
- `i8`
|
||
|
|
- `i16`
|
||
|
|
- `i32`
|
||
|
|
- `i64`
|
||
|
|
- `i128`
|
||
|
|
- `u8`
|
||
|
|
- `u16`
|
||
|
|
- `u32`
|
||
|
|
- `u64`
|
||
|
|
- `u128`
|
||
|
|
- `Simd<u8, LANES>` with <const LANES: usize>
|
||
|
|
- `Simd<i8, LANES>` with <const LANES: usize>
|
||
|
|
- `Simd<u16, LANES>` with <const LANES: usize>
|
||
|
|
- `Simd<i16, LANES>` with <const LANES: usize>
|
||
|
|
- `Simd<u32, LANES>` with <const LANES: usize>
|
||
|
|
- `Simd<i32, LANES>` with <const LANES: usize>
|
||
|
|
- `Simd<u64, LANES>` with <const LANES: usize>
|
||
|
|
- `Simd<i64, LANES>` with <const LANES: usize>
|
||
|
|
- `usize`
|
||
|
|
- `char`
|
||
|
|
- `core::time::Duration`
|
||
|
|
|
||
|
|
#### Trait `UniformSampler`
|
||
|
|
|
||
|
|
Helper trait handling actual uniform sampling.
|
||
|
|
|
||
|
|
See the [module documentation] on how to implement [`Uniform`] range
|
||
|
|
sampling for a custom type.
|
||
|
|
|
||
|
|
Implementation of [`sample_single`] is optional, and is only useful when
|
||
|
|
the implementation can be faster than `Self::new(low, high).sample(rng)`.
|
||
|
|
|
||
|
|
[module documentation]: crate::distr::uniform
|
||
|
|
[`sample_single`]: UniformSampler::sample_single
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub trait UniformSampler: Sized {
|
||
|
|
/* Associated items */
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
> This trait is not object-safe and cannot be used in dynamic trait objects.
|
||
|
|
|
||
|
|
##### Required Items
|
||
|
|
|
||
|
|
###### Associated Types
|
||
|
|
|
||
|
|
- `X`: The type sampled by this implementation.
|
||
|
|
|
||
|
|
###### Required Methods
|
||
|
|
|
||
|
|
- `new`: Construct self, with inclusive lower bound and exclusive upper bound `[low, high)`.
|
||
|
|
- `new_inclusive`: Construct self, with inclusive bounds `[low, high]`.
|
||
|
|
- `sample`: Sample a value.
|
||
|
|
|
||
|
|
##### Provided Methods
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample_single<R: Rng + ?Sized, B1, B2>(low: B1, high: B2, rng: &mut R) -> Result<<Self as >::X, Error>
|
||
|
|
where
|
||
|
|
B1: SampleBorrow<<Self as >::X> + Sized,
|
||
|
|
B2: SampleBorrow<<Self as >::X> + Sized { /* ... */ }
|
||
|
|
```
|
||
|
|
Sample a single value uniformly from a range with inclusive lower bound
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample_single_inclusive<R: Rng + ?Sized, B1, B2>(low: B1, high: B2, rng: &mut R) -> Result<<Self as >::X, Error>
|
||
|
|
where
|
||
|
|
B1: SampleBorrow<<Self as >::X> + Sized,
|
||
|
|
B2: SampleBorrow<<Self as >::X> + Sized { /* ... */ }
|
||
|
|
```
|
||
|
|
Sample a single value uniformly from a range with inclusive lower bound
|
||
|
|
|
||
|
|
##### Implementations
|
||
|
|
|
||
|
|
This trait is implemented for the following types:
|
||
|
|
|
||
|
|
- `UniformFloat<f32>`
|
||
|
|
- `UniformFloat<f64>`
|
||
|
|
- `UniformFloat<f32x2>`
|
||
|
|
- `UniformFloat<f32x4>`
|
||
|
|
- `UniformFloat<f32x8>`
|
||
|
|
- `UniformFloat<f32x16>`
|
||
|
|
- `UniformFloat<f64x2>`
|
||
|
|
- `UniformFloat<f64x4>`
|
||
|
|
- `UniformFloat<f64x8>`
|
||
|
|
- `UniformInt<i8>`
|
||
|
|
- `UniformInt<i16>`
|
||
|
|
- `UniformInt<i32>`
|
||
|
|
- `UniformInt<i64>`
|
||
|
|
- `UniformInt<i128>`
|
||
|
|
- `UniformInt<u8>`
|
||
|
|
- `UniformInt<u16>`
|
||
|
|
- `UniformInt<u32>`
|
||
|
|
- `UniformInt<u64>`
|
||
|
|
- `UniformInt<u128>`
|
||
|
|
- `UniformInt<Simd<u8, LANES>>` with <const LANES: usize>
|
||
|
|
- `UniformInt<Simd<i8, LANES>>` with <const LANES: usize>
|
||
|
|
- `UniformInt<Simd<u16, LANES>>` with <const LANES: usize>
|
||
|
|
- `UniformInt<Simd<i16, LANES>>` with <const LANES: usize>
|
||
|
|
- `UniformInt<Simd<u32, LANES>>` with <const LANES: usize>
|
||
|
|
- `UniformInt<Simd<i32, LANES>>` with <const LANES: usize>
|
||
|
|
- `UniformInt<Simd<u64, LANES>>` with <const LANES: usize>
|
||
|
|
- `UniformInt<Simd<i64, LANES>>` with <const LANES: usize>
|
||
|
|
- `UniformUsize`
|
||
|
|
- `UniformChar`
|
||
|
|
- `UniformDuration`
|
||
|
|
|
||
|
|
#### Trait `SampleBorrow`
|
||
|
|
|
||
|
|
Helper trait similar to [`Borrow`] but implemented
|
||
|
|
only for [`SampleUniform`] and references to [`SampleUniform`]
|
||
|
|
in order to resolve ambiguity issues.
|
||
|
|
|
||
|
|
[`Borrow`]: std::borrow::Borrow
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub trait SampleBorrow<Borrowed> {
|
||
|
|
/* Associated items */
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
##### Required Items
|
||
|
|
|
||
|
|
###### Required Methods
|
||
|
|
|
||
|
|
- `borrow`: Immutably borrows from an owned value. See [`Borrow::borrow`]
|
||
|
|
|
||
|
|
##### Implementations
|
||
|
|
|
||
|
|
This trait is implemented for the following types:
|
||
|
|
|
||
|
|
- `Borrowed` with <Borrowed>
|
||
|
|
- `&Borrowed` with <Borrowed>
|
||
|
|
|
||
|
|
#### Trait `SampleRange`
|
||
|
|
|
||
|
|
Range that supports generating a single sample efficiently.
|
||
|
|
|
||
|
|
Any type implementing this trait can be used to specify the sampled range
|
||
|
|
for `Rng::random_range`.
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub trait SampleRange<T> {
|
||
|
|
/* Associated items */
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
> This trait is not object-safe and cannot be used in dynamic trait objects.
|
||
|
|
|
||
|
|
##### Required Items
|
||
|
|
|
||
|
|
###### Required Methods
|
||
|
|
|
||
|
|
- `sample_single`: Generate a sample from the given range.
|
||
|
|
- `is_empty`: Check whether the range is empty.
|
||
|
|
|
||
|
|
##### Implementations
|
||
|
|
|
||
|
|
This trait is implemented for the following types:
|
||
|
|
|
||
|
|
- `core::ops::Range<T>` with <T: SampleUniform + PartialOrd>
|
||
|
|
- `core::ops::RangeInclusive<T>` with <T: SampleUniform + PartialOrd>
|
||
|
|
- `RangeTo<u8>`
|
||
|
|
- `RangeToInclusive<u8>`
|
||
|
|
- `RangeTo<u16>`
|
||
|
|
- `RangeToInclusive<u16>`
|
||
|
|
- `RangeTo<u32>`
|
||
|
|
- `RangeToInclusive<u32>`
|
||
|
|
- `RangeTo<u64>`
|
||
|
|
- `RangeToInclusive<u64>`
|
||
|
|
- `RangeTo<u128>`
|
||
|
|
- `RangeToInclusive<u128>`
|
||
|
|
- `RangeTo<usize>`
|
||
|
|
- `RangeToInclusive<usize>`
|
||
|
|
|
||
|
|
### Re-exports
|
||
|
|
|
||
|
|
#### Re-export `UniformFloat`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[doc(inline)]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use float::UniformFloat;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `UniformInt`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[doc(inline)]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use int::UniformInt;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `UniformUsize`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[doc(inline)]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use int::UniformUsize;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `UniformChar`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[doc(inline)]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use other::UniformChar;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `UniformDuration`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[doc(inline)]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use other::UniformDuration;
|
||
|
|
```
|
||
|
|
|
||
|
|
## Module `weighted`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg>(feature = \"alloc\")]")`
|
||
|
|
|
||
|
|
Weighted (index) sampling
|
||
|
|
|
||
|
|
Primarily, this module houses the [`WeightedIndex`] distribution.
|
||
|
|
See also [`rand_distr::weighted`] for alternative implementations supporting
|
||
|
|
potentially-faster sampling or a more easily modifiable tree structure.
|
||
|
|
|
||
|
|
[`rand_distr::weighted`]: https://docs.rs/rand_distr/latest/rand_distr/weighted/index.html
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub mod weighted { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Types
|
||
|
|
|
||
|
|
#### Enum `Error`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `NonExhaustive`
|
||
|
|
|
||
|
|
Invalid weight errors
|
||
|
|
|
||
|
|
This type represents errors from [`WeightedIndex::new`],
|
||
|
|
[`WeightedIndex::update_weights`] and other weighted distributions.
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub enum Error {
|
||
|
|
InvalidInput,
|
||
|
|
InvalidWeight,
|
||
|
|
InsufficientNonZero,
|
||
|
|
Overflow,
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
##### Variants
|
||
|
|
|
||
|
|
###### `InvalidInput`
|
||
|
|
|
||
|
|
The input weight sequence is empty, too long, or wrongly ordered
|
||
|
|
|
||
|
|
###### `InvalidWeight`
|
||
|
|
|
||
|
|
A weight is negative, too large for the distribution, or not a valid number
|
||
|
|
|
||
|
|
###### `InsufficientNonZero`
|
||
|
|
|
||
|
|
Not enough non-zero weights are available to sample values
|
||
|
|
|
||
|
|
When attempting to sample a single value this implies that all weights
|
||
|
|
are zero. When attempting to sample `amount` values this implies that
|
||
|
|
less than `amount` weights are greater than zero.
|
||
|
|
|
||
|
|
###### `Overflow`
|
||
|
|
|
||
|
|
Overflow when calculating the sum of weights
|
||
|
|
|
||
|
|
##### Implementations
|
||
|
|
|
||
|
|
###### Trait Implementations
|
||
|
|
|
||
|
|
- **Any**
|
||
|
|
- ```rust
|
||
|
|
fn type_id(self: &Self) -> TypeId { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Borrow**
|
||
|
|
- ```rust
|
||
|
|
fn borrow(self: &Self) -> &T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **BorrowMut**
|
||
|
|
- ```rust
|
||
|
|
fn borrow_mut(self: &mut Self) -> &mut T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Clone**
|
||
|
|
- ```rust
|
||
|
|
fn clone(self: &Self) -> Error { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **CloneToUninit**
|
||
|
|
- ```rust
|
||
|
|
unsafe fn clone_to_uninit(self: &Self, dest: *mut u8) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Copy**
|
||
|
|
- **Debug**
|
||
|
|
- ```rust
|
||
|
|
fn fmt(self: &Self, f: &mut $crate::fmt::Formatter<''_>) -> $crate::fmt::Result { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Display**
|
||
|
|
- ```rust
|
||
|
|
fn fmt(self: &Self, f: &mut fmt::Formatter<''_>) -> fmt::Result { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Eq**
|
||
|
|
- **Error**
|
||
|
|
- **Freeze**
|
||
|
|
- **From**
|
||
|
|
- ```rust
|
||
|
|
fn from(t: T) -> T { /* ... */ }
|
||
|
|
```
|
||
|
|
Returns the argument unchanged.
|
||
|
|
|
||
|
|
- **Into**
|
||
|
|
- ```rust
|
||
|
|
fn into(self: Self) -> U { /* ... */ }
|
||
|
|
```
|
||
|
|
Calls `U::from(self)`.
|
||
|
|
|
||
|
|
- **PartialEq**
|
||
|
|
- ```rust
|
||
|
|
fn eq(self: &Self, other: &Error) -> bool { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **RefUnwindSafe**
|
||
|
|
- **Send**
|
||
|
|
- **StructuralPartialEq**
|
||
|
|
- **Sync**
|
||
|
|
- **ToOwned**
|
||
|
|
- ```rust
|
||
|
|
fn to_owned(self: &Self) -> T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn clone_into(self: &Self, target: &mut T) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **ToString**
|
||
|
|
- ```rust
|
||
|
|
fn to_string(self: &Self) -> String { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **TryFrom**
|
||
|
|
- ```rust
|
||
|
|
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **TryInto**
|
||
|
|
- ```rust
|
||
|
|
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Unpin**
|
||
|
|
- **UnwindSafe**
|
||
|
|
- **VZip**
|
||
|
|
- ```rust
|
||
|
|
fn vzip(self: Self) -> V { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Traits
|
||
|
|
|
||
|
|
#### Trait `Weight`
|
||
|
|
|
||
|
|
Bounds on a weight
|
||
|
|
|
||
|
|
See usage in [`WeightedIndex`].
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub trait Weight: Clone {
|
||
|
|
/* Associated items */
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
> This trait is not object-safe and cannot be used in dynamic trait objects.
|
||
|
|
|
||
|
|
##### Required Items
|
||
|
|
|
||
|
|
###### Associated Constants
|
||
|
|
|
||
|
|
- `ZERO`: Representation of 0
|
||
|
|
|
||
|
|
###### Required Methods
|
||
|
|
|
||
|
|
- `checked_add_assign`: Checked addition
|
||
|
|
|
||
|
|
##### Implementations
|
||
|
|
|
||
|
|
This trait is implemented for the following types:
|
||
|
|
|
||
|
|
- `i8`
|
||
|
|
- `i16`
|
||
|
|
- `i32`
|
||
|
|
- `i64`
|
||
|
|
- `i128`
|
||
|
|
- `isize`
|
||
|
|
- `u8`
|
||
|
|
- `u16`
|
||
|
|
- `u32`
|
||
|
|
- `u64`
|
||
|
|
- `u128`
|
||
|
|
- `usize`
|
||
|
|
- `f32`
|
||
|
|
- `f64`
|
||
|
|
|
||
|
|
### Re-exports
|
||
|
|
|
||
|
|
#### Re-export `WeightedIndex`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use weighted_index::WeightedIndex;
|
||
|
|
```
|
||
|
|
|
||
|
|
### Types
|
||
|
|
|
||
|
|
#### Struct `StandardUniform`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg_attr>(feature = \"serde\", derive(serde::Serialize, serde::Deserialize))]")`
|
||
|
|
|
||
|
|
The Standard Uniform distribution
|
||
|
|
|
||
|
|
This [`Distribution`] is the *standard* parameterization of [`Uniform`]. Bounds
|
||
|
|
are selected according to the output type.
|
||
|
|
|
||
|
|
Assuming the provided `Rng` is well-behaved, these implementations
|
||
|
|
generate values with the following ranges and distributions:
|
||
|
|
|
||
|
|
* Integers (`i8`, `i32`, `u64`, etc.) are uniformly distributed
|
||
|
|
over the whole range of the type (thus each possible value may be sampled
|
||
|
|
with equal probability).
|
||
|
|
* `char` is uniformly distributed over all Unicode scalar values, i.e. all
|
||
|
|
code points in the range `0...0x10_FFFF`, except for the range
|
||
|
|
`0xD800...0xDFFF` (the surrogate code points). This includes
|
||
|
|
unassigned/reserved code points.
|
||
|
|
For some uses, the [`Alphanumeric`] or [`Alphabetic`] distribution will be more
|
||
|
|
appropriate.
|
||
|
|
* `bool` samples `false` or `true`, each with probability 0.5.
|
||
|
|
* Floating point types (`f32` and `f64`) are uniformly distributed in the
|
||
|
|
half-open range `[0, 1)`. See also the [notes below](#floating-point-implementation).
|
||
|
|
* Wrapping integers ([`Wrapping<T>`]), besides the type identical to their
|
||
|
|
normal integer variants.
|
||
|
|
* Non-zero integers ([`NonZeroU8`]), which are like their normal integer
|
||
|
|
variants but cannot sample zero.
|
||
|
|
|
||
|
|
The `StandardUniform` distribution also supports generation of the following
|
||
|
|
compound types where all component types are supported:
|
||
|
|
|
||
|
|
* Tuples (up to 12 elements): each element is sampled sequentially and
|
||
|
|
independently (thus, assuming a well-behaved RNG, there is no correlation
|
||
|
|
between elements).
|
||
|
|
* Arrays `[T; n]` where `T` is supported. Each element is sampled
|
||
|
|
sequentially and independently. Note that for small `T` this usually
|
||
|
|
results in the RNG discarding random bits; see also [`Rng::fill`] which
|
||
|
|
offers a more efficient approach to filling an array of integer types
|
||
|
|
with random data.
|
||
|
|
* SIMD types (requires [`simd_support`] feature) like x86's [`__m128i`]
|
||
|
|
and `std::simd`'s [`u32x4`], [`f32x4`] and [`mask32x4`] types are
|
||
|
|
effectively arrays of integer or floating-point types. Each lane is
|
||
|
|
sampled independently, potentially with more efficient random-bit-usage
|
||
|
|
(and a different resulting value) than would be achieved with sequential
|
||
|
|
sampling (as with the array types above).
|
||
|
|
|
||
|
|
## Custom implementations
|
||
|
|
|
||
|
|
The [`StandardUniform`] distribution may be implemented for user types as follows:
|
||
|
|
|
||
|
|
```
|
||
|
|
# #![allow(dead_code)]
|
||
|
|
use rand::Rng;
|
||
|
|
use rand::distr::{Distribution, StandardUniform};
|
||
|
|
|
||
|
|
struct MyF32 {
|
||
|
|
x: f32,
|
||
|
|
}
|
||
|
|
|
||
|
|
impl Distribution<MyF32> for StandardUniform {
|
||
|
|
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> MyF32 {
|
||
|
|
MyF32 { x: rng.random() }
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Example usage
|
||
|
|
```
|
||
|
|
use rand::prelude::*;
|
||
|
|
use rand::distr::StandardUniform;
|
||
|
|
|
||
|
|
let val: f32 = rand::rng().sample(StandardUniform);
|
||
|
|
println!("f32 from [0, 1): {}", val);
|
||
|
|
```
|
||
|
|
|
||
|
|
# Floating point implementation
|
||
|
|
The floating point implementations for `StandardUniform` generate a random value in
|
||
|
|
the half-open interval `[0, 1)`, i.e. including 0 but not 1.
|
||
|
|
|
||
|
|
All values that can be generated are of the form `n * ε/2`. For `f32`
|
||
|
|
the 24 most significant random bits of a `u32` are used and for `f64` the
|
||
|
|
53 most significant bits of a `u64` are used. The conversion uses the
|
||
|
|
multiplicative method: `(rng.gen::<$uty>() >> N) as $ty * (ε/2)`.
|
||
|
|
|
||
|
|
See also: [`Open01`] which samples from `(0, 1)`, [`OpenClosed01`] which
|
||
|
|
samples from `(0, 1]` and `Rng::random_range(0..1)` which also samples from
|
||
|
|
`[0, 1)`. Note that `Open01` uses transmute-based methods which yield 1 bit
|
||
|
|
less precision but may perform faster on some architectures (on modern Intel
|
||
|
|
CPUs all methods have approximately equal performance).
|
||
|
|
|
||
|
|
[`Uniform`]: uniform::Uniform
|
||
|
|
[`Wrapping<T>`]: std::num::Wrapping
|
||
|
|
[`NonZeroU8`]: std::num::NonZeroU8
|
||
|
|
[`__m128i`]: https://doc.rust-lang.org/core/arch/x86/struct.__m128i.html
|
||
|
|
[`u32x4`]: std::simd::u32x4
|
||
|
|
[`f32x4`]: std::simd::f32x4
|
||
|
|
[`mask32x4`]: std::simd::mask32x4
|
||
|
|
[`simd_support`]: https://github.com/rust-random/rand#crate-features
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub struct StandardUniform;
|
||
|
|
```
|
||
|
|
|
||
|
|
##### Implementations
|
||
|
|
|
||
|
|
###### Trait Implementations
|
||
|
|
|
||
|
|
- **Any**
|
||
|
|
- ```rust
|
||
|
|
fn type_id(self: &Self) -> TypeId { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Borrow**
|
||
|
|
- ```rust
|
||
|
|
fn borrow(self: &Self) -> &T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **BorrowMut**
|
||
|
|
- ```rust
|
||
|
|
fn borrow_mut(self: &mut Self) -> &mut T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Clone**
|
||
|
|
- ```rust
|
||
|
|
fn clone(self: &Self) -> StandardUniform { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **CloneToUninit**
|
||
|
|
- ```rust
|
||
|
|
unsafe fn clone_to_uninit(self: &Self, dest: *mut u8) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Copy**
|
||
|
|
- **Debug**
|
||
|
|
- ```rust
|
||
|
|
fn fmt(self: &Self, f: &mut $crate::fmt::Formatter<''_>) -> $crate::fmt::Result { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Default**
|
||
|
|
- ```rust
|
||
|
|
fn default() -> StandardUniform { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Deserialize**
|
||
|
|
- ```rust
|
||
|
|
fn deserialize<__D>(__deserializer: __D) -> _serde::__private::Result<Self, <__D as >::Error>
|
||
|
|
where
|
||
|
|
__D: _serde::Deserializer<''de> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **DeserializeOwned**
|
||
|
|
- **Distribution**
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> f32 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> f64 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> f32x2 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> f32x4 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> f32x8 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> f32x16 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> f64x2 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> f64x4 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> f64x8 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> u8 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> u16 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> u32 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> u64 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> u128 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> i8 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> i16 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> i32 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> i64 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> i128 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> NonZeroU8 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> NonZeroU16 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> NonZeroU32 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> NonZeroU64 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> NonZeroU128 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> NonZeroI8 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> NonZeroI16 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> NonZeroI32 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> NonZeroI64 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> NonZeroI128 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> __m128i { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> __m256i { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> __m512i { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> Simd<u8, LANES> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> Simd<i8, LANES> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> Simd<u16, LANES> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> Simd<i16, LANES> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> Simd<u32, LANES> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> Simd<i32, LANES> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> Simd<u64, LANES> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> Simd<i64, LANES> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> char { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> bool { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> Mask<T, LANES> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> (A) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> (A, B) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> (A, B, C) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> (A, B, C, D) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> (A, B, C, D, E) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> (A, B, C, D, E, F) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> (A, B, C, D, E, F, G) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> (A, B, C, D, E, F, G, H) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> (A, B, C, D, E, F, G, H, I) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> (A, B, C, D, E, F, G, H, I, J) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> (A, B, C, D, E, F, G, H, I, J, K) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> (A, B, C, D, E, F, G, H, I, J, K, L) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> [T; N] { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn sample<R: Rng + ?Sized>(self: &Self, rng: &mut R) -> Wrapping<T> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Freeze**
|
||
|
|
- **From**
|
||
|
|
- ```rust
|
||
|
|
fn from(t: T) -> T { /* ... */ }
|
||
|
|
```
|
||
|
|
Returns the argument unchanged.
|
||
|
|
|
||
|
|
- **Into**
|
||
|
|
- ```rust
|
||
|
|
fn into(self: Self) -> U { /* ... */ }
|
||
|
|
```
|
||
|
|
Calls `U::from(self)`.
|
||
|
|
|
||
|
|
- **RefUnwindSafe**
|
||
|
|
- **SampleString**
|
||
|
|
- ```rust
|
||
|
|
fn append_string<R: Rng + ?Sized>(self: &Self, rng: &mut R, s: &mut String, len: usize) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Send**
|
||
|
|
- **Serialize**
|
||
|
|
- ```rust
|
||
|
|
fn serialize<__S>(self: &Self, __serializer: __S) -> _serde::__private::Result<<__S as >::Ok, <__S as >::Error>
|
||
|
|
where
|
||
|
|
__S: _serde::Serializer { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Sync**
|
||
|
|
- **ToOwned**
|
||
|
|
- ```rust
|
||
|
|
fn to_owned(self: &Self) -> T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn clone_into(self: &Self, target: &mut T) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **TryFrom**
|
||
|
|
- ```rust
|
||
|
|
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **TryInto**
|
||
|
|
- ```rust
|
||
|
|
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Unpin**
|
||
|
|
- **UnwindSafe**
|
||
|
|
- **VZip**
|
||
|
|
- ```rust
|
||
|
|
fn vzip(self: Self) -> V { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Re-exports
|
||
|
|
|
||
|
|
#### Re-export `Bernoulli`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use self::bernoulli::Bernoulli;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `BernoulliError`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use self::bernoulli::BernoulliError;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `SampleString`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg>(feature = \"alloc\")]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use self::distribution::SampleString;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `Distribution`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use self::distribution::Distribution;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `Iter`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use self::distribution::Iter;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `Map`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use self::distribution::Map;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `Open01`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use self::float::Open01;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `OpenClosed01`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use self::float::OpenClosed01;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `Alphabetic`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use self::other::Alphabetic;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `Alphanumeric`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use self::other::Alphanumeric;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `Uniform`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[doc(inline)]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use self::uniform::Uniform;
|
||
|
|
```
|
||
|
|
|
||
|
|
## Module `prelude`
|
||
|
|
|
||
|
|
Convenience re-export of common members
|
||
|
|
|
||
|
|
Like the standard library's prelude, this module simplifies importing of
|
||
|
|
common items. Unlike the standard prelude, the contents of this module must
|
||
|
|
be imported manually:
|
||
|
|
|
||
|
|
```
|
||
|
|
use rand::prelude::*;
|
||
|
|
# let mut r = StdRng::from_rng(&mut rand::rng());
|
||
|
|
# let _: f32 = r.random();
|
||
|
|
```
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub mod prelude { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Re-exports
|
||
|
|
|
||
|
|
#### Re-export `Distribution`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[doc(no_inline)]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use crate::distr::Distribution;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `SmallRng`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg>(feature = \"small_rng\")]")`
|
||
|
|
- `Other("#[doc(no_inline)]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use crate::rngs::SmallRng;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `StdRng`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg>(feature = \"std_rng\")]")`
|
||
|
|
- `Other("#[doc(no_inline)]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use crate::rngs::StdRng;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `ThreadRng`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[doc(no_inline)]")`
|
||
|
|
- `Other("#[<cfg>(feature = \"thread_rng\")]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use crate::rngs::ThreadRng;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `IndexedMutRandom`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[doc(no_inline)]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use crate::seq::IndexedMutRandom;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `IndexedRandom`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[doc(no_inline)]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use crate::seq::IndexedRandom;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `IteratorRandom`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[doc(no_inline)]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use crate::seq::IteratorRandom;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `SliceRandom`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[doc(no_inline)]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use crate::seq::SliceRandom;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `CryptoRng`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[doc(no_inline)]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use crate::CryptoRng;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `Rng`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[doc(no_inline)]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use crate::Rng;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `RngCore`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[doc(no_inline)]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use crate::RngCore;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `SeedableRng`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[doc(no_inline)]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use crate::SeedableRng;
|
||
|
|
```
|
||
|
|
|
||
|
|
## Module `rngs`
|
||
|
|
|
||
|
|
Random number generators and adapters
|
||
|
|
|
||
|
|
This crate provides a small selection of non-[portable] generators.
|
||
|
|
See also [Types of generators] and [Our RNGs] in the book.
|
||
|
|
|
||
|
|
## Generators
|
||
|
|
|
||
|
|
This crate provides a small selection of non-[portable] random number generators:
|
||
|
|
|
||
|
|
- [`OsRng`] is a stateless interface over the operating system's random number
|
||
|
|
source. This is typically secure with some form of periodic re-seeding.
|
||
|
|
- [`ThreadRng`], provided by [`crate::rng()`], is a handle to a
|
||
|
|
thread-local generator with periodic seeding from [`OsRng`]. Because this
|
||
|
|
is local, it is typically much faster than [`OsRng`]. It should be
|
||
|
|
secure, but see documentation on [`ThreadRng`].
|
||
|
|
- [`StdRng`] is a CSPRNG chosen for good performance and trust of security
|
||
|
|
(based on reviews, maturity and usage). The current algorithm is ChaCha12,
|
||
|
|
which is well established and rigorously analysed.
|
||
|
|
[`StdRng`] is the deterministic generator used by [`ThreadRng`] but
|
||
|
|
without the periodic reseeding or thread-local management.
|
||
|
|
- [`SmallRng`] is a relatively simple, insecure generator designed to be
|
||
|
|
fast, use little memory, and pass various statistical tests of
|
||
|
|
randomness quality.
|
||
|
|
|
||
|
|
The algorithms selected for [`StdRng`] and [`SmallRng`] may change in any
|
||
|
|
release and may be platform-dependent, therefore they are not
|
||
|
|
[reproducible][portable].
|
||
|
|
|
||
|
|
### Additional generators
|
||
|
|
|
||
|
|
- The [`rdrand`] crate provides an interface to the RDRAND and RDSEED
|
||
|
|
instructions available in modern Intel and AMD CPUs.
|
||
|
|
- The [`rand_jitter`] crate provides a user-space implementation of
|
||
|
|
entropy harvesting from CPU timer jitter, but is very slow and has
|
||
|
|
[security issues](https://github.com/rust-random/rand/issues/699).
|
||
|
|
- The [`rand_chacha`] crate provides [portable] implementations of
|
||
|
|
generators derived from the [ChaCha] family of stream ciphers
|
||
|
|
- The [`rand_pcg`] crate provides [portable] implementations of a subset
|
||
|
|
of the [PCG] family of small, insecure generators
|
||
|
|
- The [`rand_xoshiro`] crate provides [portable] implementations of the
|
||
|
|
[xoshiro] family of small, insecure generators
|
||
|
|
|
||
|
|
For more, search [crates with the `rng` tag].
|
||
|
|
|
||
|
|
## Traits and functionality
|
||
|
|
|
||
|
|
All generators implement [`RngCore`] and thus also [`Rng`][crate::Rng].
|
||
|
|
See also the [Random Values] chapter in the book.
|
||
|
|
|
||
|
|
Secure RNGs may additionally implement the [`CryptoRng`] trait.
|
||
|
|
|
||
|
|
Use the [`rand_core`] crate when implementing your own RNGs.
|
||
|
|
|
||
|
|
[portable]: https://rust-random.github.io/book/crate-reprod.html
|
||
|
|
[Types of generators]: https://rust-random.github.io/book/guide-gen.html
|
||
|
|
[Our RNGs]: https://rust-random.github.io/book/guide-rngs.html
|
||
|
|
[Random Values]: https://rust-random.github.io/book/guide-values.html
|
||
|
|
[`Rng`]: crate::Rng
|
||
|
|
[`RngCore`]: crate::RngCore
|
||
|
|
[`CryptoRng`]: crate::CryptoRng
|
||
|
|
[`SeedableRng`]: crate::SeedableRng
|
||
|
|
[`rdrand`]: https://crates.io/crates/rdrand
|
||
|
|
[`rand_jitter`]: https://crates.io/crates/rand_jitter
|
||
|
|
[`rand_chacha`]: https://crates.io/crates/rand_chacha
|
||
|
|
[`rand_pcg`]: https://crates.io/crates/rand_pcg
|
||
|
|
[`rand_xoshiro`]: https://crates.io/crates/rand_xoshiro
|
||
|
|
[crates with the `rng` tag]: https://crates.io/keywords/rng
|
||
|
|
[chacha]: https://cr.yp.to/chacha.html
|
||
|
|
[PCG]: https://www.pcg-random.org/
|
||
|
|
[xoshiro]: https://prng.di.unimi.it/
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub mod rngs { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Modules
|
||
|
|
|
||
|
|
## Module `mock`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[allow(deprecated)]")`
|
||
|
|
|
||
|
|
**⚠️ Deprecated since 0.9.2**
|
||
|
|
|
||
|
|
Mock random number generator
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub mod mock { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Types
|
||
|
|
|
||
|
|
#### Struct `StepRng`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg_attr>(feature = \"serde\", derive(Serialize, Deserialize))]")`
|
||
|
|
|
||
|
|
**⚠️ Deprecated since 0.9.2**: Deprecated without replacement
|
||
|
|
|
||
|
|
A mock generator yielding very predictable output
|
||
|
|
|
||
|
|
This generates an arithmetic sequence (i.e. adds a constant each step)
|
||
|
|
over a `u64` number, using wrapping arithmetic. If the increment is 0
|
||
|
|
the generator yields a constant.
|
||
|
|
|
||
|
|
Other integer types (64-bit and smaller) are produced via cast from `u64`.
|
||
|
|
|
||
|
|
Other types are produced via their implementation of [`Rng`](crate::Rng) or
|
||
|
|
[`Distribution`](crate::distr::Distribution).
|
||
|
|
Output values may not be intuitive and may change in future releases but
|
||
|
|
are considered
|
||
|
|
[portable](https://rust-random.github.io/book/portability.html).
|
||
|
|
(`bool` output is true when bit `1u64 << 31` is set.)
|
||
|
|
|
||
|
|
# Example
|
||
|
|
|
||
|
|
```
|
||
|
|
# #![allow(deprecated)]
|
||
|
|
use rand::Rng;
|
||
|
|
use rand::rngs::mock::StepRng;
|
||
|
|
|
||
|
|
let mut my_rng = StepRng::new(2, 1);
|
||
|
|
let sample: [u64; 3] = my_rng.random();
|
||
|
|
assert_eq!(sample, [2, 3, 4]);
|
||
|
|
```
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub struct StepRng {
|
||
|
|
// Some fields omitted
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
##### Fields
|
||
|
|
|
||
|
|
| Name | Type | Documentation |
|
||
|
|
|------|------|---------------|
|
||
|
|
| *private fields* | ... | *Some fields have been omitted* |
|
||
|
|
|
||
|
|
##### Implementations
|
||
|
|
|
||
|
|
###### Methods
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
pub fn new(initial: u64, increment: u64) -> Self { /* ... */ }
|
||
|
|
```
|
||
|
|
Create a `StepRng`, yielding an arithmetic sequence starting with
|
||
|
|
|
||
|
|
###### Trait Implementations
|
||
|
|
|
||
|
|
- **Any**
|
||
|
|
- ```rust
|
||
|
|
fn type_id(self: &Self) -> TypeId { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Borrow**
|
||
|
|
- ```rust
|
||
|
|
fn borrow(self: &Self) -> &T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **BorrowMut**
|
||
|
|
- ```rust
|
||
|
|
fn borrow_mut(self: &mut Self) -> &mut T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Clone**
|
||
|
|
- ```rust
|
||
|
|
fn clone(self: &Self) -> StepRng { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **CloneToUninit**
|
||
|
|
- ```rust
|
||
|
|
unsafe fn clone_to_uninit(self: &Self, dest: *mut u8) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Debug**
|
||
|
|
- ```rust
|
||
|
|
fn fmt(self: &Self, f: &mut $crate::fmt::Formatter<''_>) -> $crate::fmt::Result { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Deserialize**
|
||
|
|
- ```rust
|
||
|
|
fn deserialize<__D>(__deserializer: __D) -> _serde::__private::Result<Self, <__D as >::Error>
|
||
|
|
where
|
||
|
|
__D: _serde::Deserializer<''de> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **DeserializeOwned**
|
||
|
|
- **Eq**
|
||
|
|
- **Freeze**
|
||
|
|
- **From**
|
||
|
|
- ```rust
|
||
|
|
fn from(t: T) -> T { /* ... */ }
|
||
|
|
```
|
||
|
|
Returns the argument unchanged.
|
||
|
|
|
||
|
|
- **Into**
|
||
|
|
- ```rust
|
||
|
|
fn into(self: Self) -> U { /* ... */ }
|
||
|
|
```
|
||
|
|
Calls `U::from(self)`.
|
||
|
|
|
||
|
|
- **PartialEq**
|
||
|
|
- ```rust
|
||
|
|
fn eq(self: &Self, other: &StepRng) -> bool { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **RefUnwindSafe**
|
||
|
|
- **Rng**
|
||
|
|
- **RngCore**
|
||
|
|
- ```rust
|
||
|
|
fn next_u32(self: &mut Self) -> u32 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn next_u64(self: &mut Self) -> u64 { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn fill_bytes(self: &mut Self, dst: &mut [u8]) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Send**
|
||
|
|
- **Serialize**
|
||
|
|
- ```rust
|
||
|
|
fn serialize<__S>(self: &Self, __serializer: __S) -> _serde::__private::Result<<__S as >::Ok, <__S as >::Error>
|
||
|
|
where
|
||
|
|
__S: _serde::Serializer { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **StructuralPartialEq**
|
||
|
|
- **Sync**
|
||
|
|
- **ToOwned**
|
||
|
|
- ```rust
|
||
|
|
fn to_owned(self: &Self) -> T { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn clone_into(self: &Self, target: &mut T) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **TryFrom**
|
||
|
|
- ```rust
|
||
|
|
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **TryInto**
|
||
|
|
- ```rust
|
||
|
|
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **TryRngCore**
|
||
|
|
- ```rust
|
||
|
|
fn try_next_u32(self: &mut Self) -> Result<u32, <R as TryRngCore>::Error> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn try_next_u64(self: &mut Self) -> Result<u64, <R as TryRngCore>::Error> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- ```rust
|
||
|
|
fn try_fill_bytes(self: &mut Self, dst: &mut [u8]) -> Result<(), <R as TryRngCore>::Error> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
- **Unpin**
|
||
|
|
- **UnwindSafe**
|
||
|
|
- **VZip**
|
||
|
|
- ```rust
|
||
|
|
fn vzip(self: Self) -> V { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Re-exports
|
||
|
|
|
||
|
|
#### Re-export `ReseedingRng`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use reseeding::ReseedingRng;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `SmallRng`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg>(feature = \"small_rng\")]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use self::small::SmallRng;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `StdRng`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg>(feature = \"std_rng\")]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use self::std::StdRng;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `ThreadRng`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg>(feature = \"thread_rng\")]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use self::thread::ThreadRng;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `OsRng`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg>(feature = \"os_rng\")]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use rand_core::OsRng;
|
||
|
|
```
|
||
|
|
|
||
|
|
## Module `seq`
|
||
|
|
|
||
|
|
Sequence-related functionality
|
||
|
|
|
||
|
|
This module provides:
|
||
|
|
|
||
|
|
* [`IndexedRandom`] for sampling slices and other indexable lists
|
||
|
|
* [`IndexedMutRandom`] for sampling slices and other mutably indexable lists
|
||
|
|
* [`SliceRandom`] for mutating slices
|
||
|
|
* [`IteratorRandom`] for sampling iterators
|
||
|
|
* [`index::sample`] low-level API to choose multiple indices from
|
||
|
|
`0..length`
|
||
|
|
|
||
|
|
Also see:
|
||
|
|
|
||
|
|
* [`crate::distr::weighted::WeightedIndex`] distribution which provides
|
||
|
|
weighted index sampling.
|
||
|
|
|
||
|
|
In order to make results reproducible across 32-64 bit architectures, all
|
||
|
|
`usize` indices are sampled as a `u32` where possible (also providing a
|
||
|
|
small performance boost in some cases).
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub mod seq { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Modules
|
||
|
|
|
||
|
|
## Module `index`
|
||
|
|
|
||
|
|
Low-level API for sampling indices
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub mod index { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Functions
|
||
|
|
|
||
|
|
#### Function `sample_array`
|
||
|
|
|
||
|
|
Randomly sample exactly `N` distinct indices from `0..len`, and
|
||
|
|
return them in random order (fully shuffled).
|
||
|
|
|
||
|
|
This is implemented via Floyd's algorithm. Time complexity is `O(N^2)`
|
||
|
|
and memory complexity is `O(N)`.
|
||
|
|
|
||
|
|
Returns `None` if (and only if) `N > len`.
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub fn sample_array<R, const N: usize>(rng: &mut R, len: usize) -> Option<[usize; N]>
|
||
|
|
where
|
||
|
|
R: Rng + ?Sized { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Re-exports
|
||
|
|
|
||
|
|
#### Re-export `super::index_::*`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg>(feature = \"alloc\")]")`
|
||
|
|
- `Other("#[doc(inline)]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use super::index_::*;
|
||
|
|
```
|
||
|
|
|
||
|
|
### Re-exports
|
||
|
|
|
||
|
|
#### Re-export `Error`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg>(feature = \"alloc\")]")`
|
||
|
|
- `Other("#[doc(no_inline)]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use crate::distr::weighted::Error as WeightError;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `IteratorRandom`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use iterator::IteratorRandom;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `SliceChooseIter`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg>(feature = \"alloc\")]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use slice::SliceChooseIter;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `IndexedMutRandom`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use slice::IndexedMutRandom;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `IndexedRandom`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use slice::IndexedRandom;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Re-export `SliceRandom`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use slice::SliceRandom;
|
||
|
|
```
|
||
|
|
|
||
|
|
## Functions
|
||
|
|
|
||
|
|
### Function `thread_rng`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg>(feature = \"thread_rng\")]")`
|
||
|
|
- `Other("#[attr = Inline(Hint)]")`
|
||
|
|
|
||
|
|
**⚠️ Deprecated since 0.9.0**: Renamed to `rng`
|
||
|
|
|
||
|
|
Access the thread-local generator
|
||
|
|
|
||
|
|
Use [`rand::rng()`](rng()) instead.
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub fn thread_rng() -> crate::rngs::ThreadRng { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Function `random`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg>(feature = \"thread_rng\")]")`
|
||
|
|
- `Other("#[attr = Inline(Hint)]")`
|
||
|
|
|
||
|
|
Generate a random value using the thread-local random number generator.
|
||
|
|
|
||
|
|
This function is shorthand for <code>[rng()].[random()](Rng::random)</code>:
|
||
|
|
|
||
|
|
- See [`ThreadRng`] for documentation of the generator and security
|
||
|
|
- See [`StandardUniform`] for documentation of supported types and distributions
|
||
|
|
|
||
|
|
# Examples
|
||
|
|
|
||
|
|
```
|
||
|
|
let x = rand::random::<u8>();
|
||
|
|
println!("{}", x);
|
||
|
|
|
||
|
|
let y = rand::random::<f64>();
|
||
|
|
println!("{}", y);
|
||
|
|
|
||
|
|
if rand::random() { // generates a boolean
|
||
|
|
println!("Better lucky than good!");
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
If you're calling `random()` repeatedly, consider using a local `rng`
|
||
|
|
handle to save an initialization-check on each usage:
|
||
|
|
|
||
|
|
```
|
||
|
|
use rand::Rng; // provides the `random` method
|
||
|
|
|
||
|
|
let mut rng = rand::rng(); // a local handle to the generator
|
||
|
|
|
||
|
|
let mut v = vec![1, 2, 3];
|
||
|
|
|
||
|
|
for x in v.iter_mut() {
|
||
|
|
*x = rng.random();
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
[`StandardUniform`]: distr::StandardUniform
|
||
|
|
[`ThreadRng`]: rngs::ThreadRng
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub fn random<T>() -> T
|
||
|
|
where
|
||
|
|
crate::distr::StandardUniform: Distribution<T> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Function `random_iter`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg>(feature = \"thread_rng\")]")`
|
||
|
|
- `Other("#[attr = Inline(Hint)]")`
|
||
|
|
|
||
|
|
Return an iterator over [`random()`] variates
|
||
|
|
|
||
|
|
This function is shorthand for
|
||
|
|
<code>[rng()].[random_iter](Rng::random_iter)()</code>.
|
||
|
|
|
||
|
|
# Example
|
||
|
|
|
||
|
|
```
|
||
|
|
let v: Vec<i32> = rand::random_iter().take(5).collect();
|
||
|
|
println!("{v:?}");
|
||
|
|
```
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub fn random_iter<T>() -> distr::Iter<crate::distr::StandardUniform, rngs::ThreadRng, T>
|
||
|
|
where
|
||
|
|
crate::distr::StandardUniform: Distribution<T> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Function `random_range`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg>(feature = \"thread_rng\")]")`
|
||
|
|
- `Other("#[attr = Inline(Hint)]")`
|
||
|
|
|
||
|
|
Generate a random value in the given range using the thread-local random number generator.
|
||
|
|
|
||
|
|
This function is shorthand for
|
||
|
|
<code>[rng()].[random_range](Rng::random_range)(<var>range</var>)</code>.
|
||
|
|
|
||
|
|
# Example
|
||
|
|
|
||
|
|
```
|
||
|
|
let y: f32 = rand::random_range(0.0..=1e9);
|
||
|
|
println!("{}", y);
|
||
|
|
|
||
|
|
let words: Vec<&str> = "Mary had a little lamb".split(' ').collect();
|
||
|
|
println!("{}", words[rand::random_range(..words.len())]);
|
||
|
|
```
|
||
|
|
Note that the first example can also be achieved (without `collect`'ing
|
||
|
|
to a `Vec`) using [`seq::IteratorRandom::choose`].
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub fn random_range<T, R>(range: R) -> T
|
||
|
|
where
|
||
|
|
T: distr::uniform::SampleUniform,
|
||
|
|
R: distr::uniform::SampleRange<T> { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Function `random_bool`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg>(feature = \"thread_rng\")]")`
|
||
|
|
- `Other("#[attr = Inline(Hint)]")`
|
||
|
|
- `Other("#[attr = TrackCaller]")`
|
||
|
|
|
||
|
|
Return a bool with a probability `p` of being true.
|
||
|
|
|
||
|
|
This function is shorthand for
|
||
|
|
<code>[rng()].[random_bool](Rng::random_bool)(<var>p</var>)</code>.
|
||
|
|
|
||
|
|
# Example
|
||
|
|
|
||
|
|
```
|
||
|
|
println!("{}", rand::random_bool(1.0 / 3.0));
|
||
|
|
```
|
||
|
|
|
||
|
|
# Panics
|
||
|
|
|
||
|
|
If `p < 0` or `p > 1`.
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub fn random_bool(p: f64) -> bool { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Function `random_ratio`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg>(feature = \"thread_rng\")]")`
|
||
|
|
- `Other("#[attr = Inline(Hint)]")`
|
||
|
|
- `Other("#[attr = TrackCaller]")`
|
||
|
|
|
||
|
|
Return a bool with a probability of `numerator/denominator` of being
|
||
|
|
true.
|
||
|
|
|
||
|
|
That is, `random_ratio(2, 3)` has chance of 2 in 3, or about 67%, of
|
||
|
|
returning true. If `numerator == denominator`, then the returned value
|
||
|
|
is guaranteed to be `true`. If `numerator == 0`, then the returned
|
||
|
|
value is guaranteed to be `false`.
|
||
|
|
|
||
|
|
See also the [`Bernoulli`] distribution, which may be faster if
|
||
|
|
sampling from the same `numerator` and `denominator` repeatedly.
|
||
|
|
|
||
|
|
This function is shorthand for
|
||
|
|
<code>[rng()].[random_ratio](Rng::random_ratio)(<var>numerator</var>, <var>denominator</var>)</code>.
|
||
|
|
|
||
|
|
# Panics
|
||
|
|
|
||
|
|
If `denominator == 0` or `numerator > denominator`.
|
||
|
|
|
||
|
|
# Example
|
||
|
|
|
||
|
|
```
|
||
|
|
println!("{}", rand::random_ratio(2, 3));
|
||
|
|
```
|
||
|
|
|
||
|
|
[`Bernoulli`]: distr::Bernoulli
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub fn random_ratio(numerator: u32, denominator: u32) -> bool { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Function `fill`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg>(feature = \"thread_rng\")]")`
|
||
|
|
- `Other("#[attr = Inline(Hint)]")`
|
||
|
|
- `Other("#[attr = TrackCaller]")`
|
||
|
|
|
||
|
|
Fill any type implementing [`Fill`] with random data
|
||
|
|
|
||
|
|
This function is shorthand for
|
||
|
|
<code>[rng()].[fill](Rng::fill)(<var>dest</var>)</code>.
|
||
|
|
|
||
|
|
# Example
|
||
|
|
|
||
|
|
```
|
||
|
|
let mut arr = [0i8; 20];
|
||
|
|
rand::fill(&mut arr[..]);
|
||
|
|
```
|
||
|
|
|
||
|
|
Note that you can instead use [`random()`] to generate an array of random
|
||
|
|
data, though this is slower for small elements (smaller than the RNG word
|
||
|
|
size).
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub fn fill<T: Fill + ?Sized>(dest: &mut T) { /* ... */ }
|
||
|
|
```
|
||
|
|
|
||
|
|
## Re-exports
|
||
|
|
|
||
|
|
### Re-export `rand_core`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use rand_core;
|
||
|
|
```
|
||
|
|
|
||
|
|
### Re-export `CryptoRng`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use rand_core::CryptoRng;
|
||
|
|
```
|
||
|
|
|
||
|
|
### Re-export `RngCore`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use rand_core::RngCore;
|
||
|
|
```
|
||
|
|
|
||
|
|
### Re-export `SeedableRng`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use rand_core::SeedableRng;
|
||
|
|
```
|
||
|
|
|
||
|
|
### Re-export `TryCryptoRng`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use rand_core::TryCryptoRng;
|
||
|
|
```
|
||
|
|
|
||
|
|
### Re-export `TryRngCore`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use rand_core::TryRngCore;
|
||
|
|
```
|
||
|
|
|
||
|
|
### Re-export `rng`
|
||
|
|
|
||
|
|
**Attributes:**
|
||
|
|
|
||
|
|
- `Other("#[<cfg>(feature = \"thread_rng\")]")`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use crate::rngs::thread::rng;
|
||
|
|
```
|
||
|
|
|
||
|
|
### Re-export `Fill`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use rng::Fill;
|
||
|
|
```
|
||
|
|
|
||
|
|
### Re-export `Rng`
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub use rng::Rng;
|
||
|
|
```
|
||
|
|
|