Trait Rng
trait Rng: RngCore
User-level interface for RNGs
RngCore is the dyn-safe implementation-level interface for Random
(Number) Generators. This trait, Rng, provides a user-level interface on
RNGs. It is implemented automatically for any R: RngCore.
This trait must usually be brought into scope via use rand::Rng; or
use rand::prelude::*;.
Generic usage
The basic pattern is fn foo<R: Rng + ?Sized>(rng: &mut R). Some
things are worth noting here:
- Since
Rng: RngCoreand everyRngCoreimplementsRng, it makes no difference whether we useR: RngorR: RngCore. - The
+ ?Sizedun-bounding allows functions to be called directly on type-erased references; i.e.foo(r)wherer: &mut dyn RngCore. Without this it would be necessary to writefoo(&mut r).
An alternative pattern is possible: fn foo<R: Rng>(rng: R). This has some
trade-offs. It allows the argument to be consumed directly without a &mut
(which is how from_rng(rand::rng()) works); also it still works directly
on references (including type-erased references). Unfortunately within the
function foo it is not known whether rng is a reference type or not,
hence many uses of rng require an extra reference, either explicitly
(distr.sample(&mut rng)) or implicitly (rng.random()); one may hope the
optimiser can remove redundant references later.
Example:
use Rng;
Sized>
# let v = foo;
Provided Methods
fn random<T>(self: &mut Self) -> T where StandardUniform: Distribution<T>Return a random value via the
StandardUniformdistribution.Example
use Rng; let mut rng = rng; let x: u32 = rng.random; println!; println!;Arrays and tuples
The
rng.random()method is able to generate arrays and tuples (up to 12 elements), so long as all element types can be generated.For arrays of integers, especially for those with small element types (< 64 bit), it will likely be faster to instead use
Rng::fill, though note that generated values will differ.use Rng; let mut rng = rng; let tuple: = rng.random; // arbitrary tuple support let arr1: = rng.random; // array construction let mut arr2 = ; rng.fill; // array fillfn random_iter<T>(self: Self) -> Iter<StandardUniform, Self, T> where Self: Sized, StandardUniform: Distribution<T>Return an iterator over
randomvariatesThis is a just a wrapper over
Rng::sample_iterusingdistr::StandardUniform.Note: this method consumes its argument. Use
(&mut rng).random_iter()to avoid consuming the RNG.Example
use ; let rng = new; let v: = rng.random_iter.take.collect; assert_eq!;fn random_range<T, R>(self: &mut Self, range: R) -> T where T: SampleUniform, R: SampleRange<T>Generate a random value in the given range.
This function is optimised for the case that only a single sample is made from the given range. See also the
Uniformdistribution type which may be faster if sampling from the same range repeatedly.All types support
low..high_exclusiveandlow..=highrange syntax. Unsigned integer types also support..high_exclusiveand..=highsyntax.Panics
Panics if the range is empty, or if
high - lowoverflows for floats.Example
use Rng; let mut rng = rng; // Exclusive range let n: u32 = rng.random_range; println!; let m: f64 = rng.random_range; println!; // Inclusive range let n: u32 = rng.random_range; println!;fn random_bool(self: &mut Self, p: f64) -> boolReturn a bool with a probability
pof being true.See also the
Bernoullidistribution, which may be faster if sampling from the same probability repeatedly.Example
use Rng; let mut rng = rng; println!;Panics
If
p < 0orp > 1.fn random_ratio(self: &mut Self, numerator: u32, denominator: u32) -> boolReturn a bool with a probability of
numerator/denominatorof being true.That is,
random_ratio(2, 3)has chance of 2 in 3, or about 67%, of returning true. Ifnumerator == denominator, then the returned value is guaranteed to betrue. Ifnumerator == 0, then the returned value is guaranteed to befalse.See also the
Bernoullidistribution, which may be faster if sampling from the samenumeratoranddenominatorrepeatedly.Panics
If
denominator == 0ornumerator > denominator.Example
use Rng; let mut rng = rng; println!;fn sample<T, D: Distribution<T>>(self: &mut Self, distr: D) -> TSample a new value, using the given distribution.
Example
use Rng; use Uniform; let mut rng = rng; let x = rng.sample; // Type annotation requires two types, the type and distribution; the // distribution can be inferred. let y = rng.;fn sample_iter<T, D>(self: Self, distr: D) -> Iter<D, Self, T> where D: Distribution<T>, Self: SizedCreate an iterator that generates values using the given distribution.
Note: this method consumes its arguments. Use
(&mut rng).sample_iter(..)to avoid consuming the RNG.Example
use Rng; use ; let mut rng = rng; // Vec of 16 x f32: let v: = .sample_iter.take.collect; // String: let s: String = .sample_iter .take .map .collect; // Combined values println!; // Dice-rolling: let die_range = new_inclusive.unwrap; let mut roll_die = .sample_iter; while roll_die.next.unwrap != 6fn fill<T: Fill + ?Sized>(self: &mut Self, dest: &mut T)Fill any type implementing
Fillwith random dataThis method is implemented for types which may be safely reinterpreted as an (aligned)
[u8]slice then filled with random data. It is often faster than usingRng::randombut not value-equivalent.The distribution is expected to be uniform with portable results, but this cannot be guaranteed for third-party implementations.
Example
use Rng; let mut arr = ; rng.fill;fn gen<T>(self: &mut Self) -> T where StandardUniform: Distribution<T>Alias for
Rng::random.fn gen_range<T, R>(self: &mut Self, range: R) -> T where T: SampleUniform, R: SampleRange<T>Alias for
Rng::random_range.fn gen_bool(self: &mut Self, p: f64) -> boolAlias for
Rng::random_bool.fn gen_ratio(self: &mut Self, numerator: u32, denominator: u32) -> boolAlias for
Rng::random_ratio.
Implementors
impl<R> Rng for ThreadRngimpl<R: RngCore + ?Sized> Rng for Rimpl<R> Rng for SmallRngimpl<R> Rng for ReseedingRng<R, Rsdr>impl<R> Rng for StepRngimpl<R> Rng for StdRng