`pub struct SmallRng(/* private fields */);`

## Expand description

A small-state, fast, non-crypto, non-portable PRNG

This is the “standard small” RNG, a generator with the following properties:

- Non-portable: any future library version may replace the algorithm and results may be platform-dependent. (For a small portable generator, use the rand_pcg or rand_xoshiro crate.)
- Non-cryptographic: output is easy to predict (insecure)
- Quality: statistically good quality
- Fast: the RNG is fast for both bulk generation and single values, with consistent cost of method calls
- Fast initialization
- Small state: little memory usage (current state size is 16-32 bytes depending on platform)

The current algorithm is
`Xoshiro256PlusPlus`

on 64-bit platforms and `Xoshiro128PlusPlus`

on 32-bit
platforms. Both are also implemented by the rand_xoshiro crate.

### §Seeding (construction)

This generator implements the `SeedableRng`

trait. All methods are
suitable for seeding, but note that, even with a fixed seed, output is not
portable. Some suggestions:

- Seed
**from an integer**via`seed_from_u64`

. This uses a hash function internally to yield a (typically) good seed from any input.`let rng = SmallRng::seed_from_u64(1);`

- With a fresh seed,
**direct from the OS**(implies a syscall):`let rng = SmallRng::from_os_rng();`

- Via
`SmallRng::from_thread_rng`

:`let rng = SmallRng::from_thread_rng();`

See also Seeding RNGs in the book.

### §Generation

The generators implements `RngCore`

and thus also `Rng`

.
See also the Random Values chapter in the book.

## Implementations§

Source§### impl SmallRng

### impl SmallRng

Source#### pub fn from_thread_rng() -> Self

#### pub fn from_thread_rng() -> Self

Construct an instance seeded from `rand::rng`

##### §Panics

This method panics only if `crate::rng()`

fails to
initialize.

## Trait Implementations§

Source§### impl SeedableRng for SmallRng

### impl SeedableRng for SmallRng

Source§#### type Seed = [u8; 32]

#### type Seed = [u8; 32]

Seed type, which is restricted to types mutably-dereferenceable as

`u8`

arrays (we recommend `[u8; N]`

for some `N`

). Read moreSource§#### fn seed_from_u64(state: u64) -> Self

#### fn seed_from_u64(state: u64) -> Self

Create a new PRNG using a

`u64`

seed. Read moreSource§#### fn from_rng(rng: &mut impl RngCore) -> Self

#### fn from_rng(rng: &mut impl RngCore) -> Self

Create a new PRNG seeded from an infallible

`Rng`

. Read moreSource§#### fn try_from_rng<R>(rng: &mut R) -> Result<Self, <R as TryRngCore>::Error>where
R: TryRngCore,

#### fn try_from_rng<R>(rng: &mut R) -> Result<Self, <R as TryRngCore>::Error>where
R: TryRngCore,

Create a new PRNG seeded from a potentially fallible

`Rng`

. Read moreSource§#### fn from_os_rng() -> Self

#### fn from_os_rng() -> Self

### impl Eq for SmallRng

### impl StructuralPartialEq for SmallRng

## Auto Trait Implementations§

### impl Freeze for SmallRng

### impl RefUnwindSafe for SmallRng

### impl Send for SmallRng

### impl Sync for SmallRng

### impl Unpin for SmallRng

### impl UnwindSafe for SmallRng

## 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

Mutably borrows from an owned value. Read more

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)

🔬This is a nightly-only experimental API. (

`clone_to_uninit`

)Source§### impl<R> Rng for R

### impl<R> Rng for R

Source§#### fn random<T>(&mut self) -> Twhere
Standard: Distribution<T>,

#### fn random<T>(&mut self) -> Twhere
Standard: Distribution<T>,

Source§#### fn random_range<T, R>(&mut self, range: R) -> Twhere
T: SampleUniform,
R: SampleRange<T>,

#### fn random_range<T, R>(&mut self, range: R) -> Twhere
T: SampleUniform,
R: SampleRange<T>,

Generate a random value in the given range. Read more

Source§#### fn random_bool(&mut self, p: f64) -> bool

#### fn random_bool(&mut self, p: f64) -> bool

Return a bool with a probability

`p`

of being true. Read moreSource§#### fn random_ratio(&mut self, numerator: u32, denominator: u32) -> bool

#### fn random_ratio(&mut self, numerator: u32, denominator: u32) -> bool

Return a bool with a probability of

`numerator/denominator`

of being
true. Read moreSource§#### fn sample<T, D: Distribution<T>>(&mut self, distr: D) -> T

#### fn sample<T, D: Distribution<T>>(&mut self, distr: D) -> T

Sample a new value, using the given distribution. Read more

Source§#### fn sample_iter<T, D>(self, distr: D) -> DistIter<D, Self, T> ⓘwhere
D: Distribution<T>,
Self: Sized,

#### fn sample_iter<T, D>(self, distr: D) -> DistIter<D, Self, T> ⓘwhere
D: Distribution<T>,
Self: Sized,

Create an iterator that generates values using the given distribution. Read more

Source§#### fn gen<T>(&mut self) -> Twhere
Standard: Distribution<T>,

#### fn gen<T>(&mut self) -> Twhere
Standard: Distribution<T>,

👎Deprecated since 0.9.0: Renamed to

`random`

to avoid conflict with the new `gen`

keyword in Rust 2024.Alias for

`Rng::random`

.Source§#### fn gen_range<T, R>(&mut self, range: R) -> Twhere
T: SampleUniform,
R: SampleRange<T>,

#### fn gen_range<T, R>(&mut self, range: R) -> Twhere
T: SampleUniform,
R: SampleRange<T>,

👎Deprecated since 0.9.0: Renamed to

`random_range`

Alias for

`Rng::random_range`

.Source§### impl<R> TryRngCore for Rwhere
R: RngCore,

### impl<R> TryRngCore for Rwhere
R: RngCore,

Source§#### type Error = Infallible

#### type Error = Infallible

The type returned in the event of a RNG error.

Source§#### fn try_next_u32(&mut self) -> Result<u32, <R as TryRngCore>::Error>

#### fn try_next_u32(&mut self) -> Result<u32, <R as TryRngCore>::Error>

Return the next random

`u32`

.Source§#### fn try_next_u64(&mut self) -> Result<u64, <R as TryRngCore>::Error>

#### fn try_next_u64(&mut self) -> Result<u64, <R as TryRngCore>::Error>

Return the next random

`u64`

.Source§#### fn try_fill_bytes(
&mut self,
dst: &mut [u8],
) -> Result<(), <R as TryRngCore>::Error>

#### fn try_fill_bytes( &mut self, dst: &mut [u8], ) -> Result<(), <R as TryRngCore>::Error>

Fill

`dest`

entirely with random data.Source§#### fn read_adapter(&mut self) -> RngReadAdapter<'_, Self>where
Self: Sized,

#### fn read_adapter(&mut self) -> RngReadAdapter<'_, Self>where
Self: Sized,

Convert an

`RngCore`

to a `RngReadAdapter`

.