`pub struct Standard;`

## Expand description

A generic random value distribution, implemented for many primitive types. Usually generates values with a numerically uniform distribution, and with a range appropriate to the type.

### §Provided implementations

Assuming the provided `Rng`

is well-behaved, these implementations
generate values with the following ranges and distributions:

- Integers (
`i32`

,`u32`

,`isize`

,`usize`

, etc.): Uniformly distributed over all values of the type. `char`

: 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.`bool`

: Generates`false`

or`true`

, each with probability 0.5.- Floating point types (
`f32`

and`f64`

): Uniformly distributed in the half-open range`[0, 1)`

. See notes below. - Wrapping integers (
`Wrapping<T>`

), besides the type identical to their normal integer variants.

The `Standard`

distribution also supports generation of the following
compound types where all component types are supported:

- Tuples (up to 12 elements): each element is generated sequentially.
- Arrays (up to 32 elements): each element is generated sequentially;
see also [
`Rng::fill`

] which supports arbitrary array length for integer and float types and tends to be faster for`u32`

and smaller types. When using`rustc`

≥ 1.51, enable the`min_const_gen`

feature to support arrays larger than 32 elements. Note that [`Rng::fill`

] and`Standard`

’s array support are*not*equivalent: the former is optimised for integer types (using fewer RNG calls for element types smaller than the RNG word size), while the latter supports any element type supported by`Standard`

. `Option<T>`

first generates a`bool`

, and if true generates and returns`Some(value)`

where`value: T`

, otherwise returning`None`

.

### §Custom implementations

The `Standard`

distribution may be implemented for user types as follows:

```
use rand::Rng;
use rand::distributions::{Distribution, Standard};
struct MyF32 {
x: f32,
}
impl Distribution<MyF32> for Standard {
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> MyF32 {
MyF32 { x: rng.gen() }
}
}
```

### §Example usage

```
use rand::prelude::*;
use rand::distributions::Standard;
let val: f32 = StdRng::from_entropy().sample(Standard);
println!("f32 from [0, 1): {}", val);
```

## §Floating point implementation

The floating point implementations for `Standard`

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::gen_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).

## Trait Implementations§

## Auto Trait Implementations§

### impl Freeze for Standard

### impl RefUnwindSafe for Standard

### impl Send for Standard

### impl Sync for Standard

### impl Unpin for Standard

### impl UnwindSafe for Standard

## Blanket Implementations§

source§### impl<T> BorrowMut<T> for Twhere
T: ?Sized,

### impl<T> BorrowMut<T> for Twhere
T: ?Sized,

source§#### fn borrow_mut(&mut self) -> &mut T

#### fn borrow_mut(&mut self) -> &mut T

source§### impl<T> CloneToUninit for Twhere
T: Clone,

### impl<T> CloneToUninit for Twhere
T: Clone,

source§#### unsafe fn clone_to_uninit(&self, dst: *mut T)

#### unsafe fn clone_to_uninit(&self, dst: *mut T)

`clone_to_uninit`

)