# Struct rand::distributions::Uniform

source · `pub struct Uniform<X: SampleUniform>(/* private fields */);`

## Expand description

Sample values uniformly between two bounds.

`Uniform::new`

and `Uniform::new_inclusive`

construct a uniform
distribution sampling from the given range; these functions may do extra
work up front to make sampling of multiple values faster. If only one sample
from the range is required, `Rng::gen_range`

can be more efficient.

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 `Standard`

distribution.

Steps are taken to avoid bias, which might be present in naive
implementations; for example `rng.gen::<u8>() % 170`

samples from the range
`[0, 169]`

but is twice as likely to select numbers less than 85 than other
values. Further, the implementations here give more weight to the high-bits
generated by the RNG than the low bits, since with some RNGs the low-bits
are of lower quality than the high bits.

Implementations must sample in `[low, high)`

range for
`Uniform::new(low, high)`

, i.e., excluding `high`

. In particular, care must
be taken to ensure that rounding never results values `< low`

or `>= high`

.

## §Example

```
use rand::distributions::{Distribution, Uniform};
let between = Uniform::try_from(10..10000).unwrap();
let mut rng = rand::thread_rng();
let mut sum = 0;
for _ in 0..1000 {
sum += between.sample(&mut rng);
}
println!("{}", sum);
```

For a single sample, `Rng::gen_range`

may be preferred:

```
use rand::Rng;
let mut rng = rand::thread_rng();
println!("{}", rng.gen_range(0..10));
```

## Implementations§

source§### impl<X: SampleUniform> Uniform<X>

### impl<X: SampleUniform> Uniform<X>

source#### pub fn new<B1, B2>(low: B1, high: B2) -> Result<Uniform<X>, Error>

#### pub fn new<B1, B2>(low: B1, high: B2) -> Result<Uniform<X>, Error>

Create a new `Uniform`

instance, which samples uniformly from the half
open range `[low, high)`

(excluding `high`

).

Fails if `low >= high`

, or if `low`

, `high`

or the range `high - low`

is
non-finite. In release mode, only the range is checked.

source#### pub fn new_inclusive<B1, B2>(low: B1, high: B2) -> Result<Uniform<X>, Error>

#### pub fn new_inclusive<B1, B2>(low: B1, high: B2) -> Result<Uniform<X>, Error>

Create a new `Uniform`

instance, which samples uniformly from the closed
range `[low, high]`

(inclusive).

Fails if `low > high`

, or if `low`

, `high`

or the range `high - low`

is
non-finite. In release mode, only the range is checked.

## Trait Implementations§

source§### impl<'de, X: SampleUniform> Deserialize<'de> for Uniform<X>where
X::Sampler: Deserialize<'de>,

### impl<'de, X: SampleUniform> Deserialize<'de> for Uniform<X>where
X::Sampler: Deserialize<'de>,

source§#### fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,

#### fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,

source§### impl DistString for Uniform<char>

### impl DistString for Uniform<char>

Note: the `String`

is potentially left with excess capacity if the range
includes non ascii chars; optionally the user may call
`string.shrink_to_fit()`

afterwards.

source§### impl<X: SampleUniform> Distribution<X> for Uniform<X>

### impl<X: SampleUniform> Distribution<X> for Uniform<X>

source§### impl<X: PartialEq + SampleUniform> PartialEq for Uniform<X>

### impl<X: PartialEq + SampleUniform> PartialEq for Uniform<X>

source§### impl<X: SampleUniform> Serialize for Uniform<X>

### impl<X: SampleUniform> Serialize for Uniform<X>

source§### impl<X: SampleUniform> TryFrom<RangeInclusive<X>> for Uniform<X>

### impl<X: SampleUniform> TryFrom<RangeInclusive<X>> for Uniform<X>

### impl<X: Copy + SampleUniform> Copy for Uniform<X>

### impl<X: Eq + SampleUniform> Eq for Uniform<X>

### impl<X: SampleUniform> StructuralPartialEq for Uniform<X>

## Auto Trait Implementations§

### impl<X> Freeze for Uniform<X>

### impl<X> RefUnwindSafe for Uniform<X>

### impl<X> Send for Uniform<X>

### impl<X> Sync for Uniform<X>

### impl<X> Unpin for Uniform<X>

### impl<X> UnwindSafe for Uniform<X>

## 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: Copy,

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

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

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

`clone_to_uninit`

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

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

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

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

`clone_to_uninit`

)