[][src]Struct sp_runtime::random_number_generator::RandomNumberGenerator

pub struct RandomNumberGenerator<Hashing: Hash> { /* fields omitted */ }

Pseudo-random number streamer. This retains the state of the random number stream. It's as secure as the combination of the seed with which it is constructed and the hash function it uses to cycle elements.

It can be saved and later reloaded using the Codec traits.

Example:

use sp_runtime::traits::{Hash, BlakeTwo256};
use sp_runtime::RandomNumberGenerator;
let random_seed = BlakeTwo256::hash(b"Sixty-nine");
let mut rng = <RandomNumberGenerator<BlakeTwo256>>::new(random_seed);
assert_eq!(rng.pick_u32(100), 59);
assert_eq!(rng.pick_item(&[1, 2, 3]), Some(&1));

This can use any cryptographic Hash function as the means of entropy-extension, and avoids needless extensions of entropy.

If you're persisting it over blocks, be aware that the sequence will start to repeat. This won't be a practical issue unless you're using tiny hash types (e.g. 64-bit) and pulling hundred of megabytes of data from it.

Implementations

impl<Hashing: Hash> RandomNumberGenerator<Hashing>[src]

pub fn new(seed: Hashing::Output) -> Self[src]

A new source of random data.

pub fn pick_u32(&mut self, max: u32) -> u32[src]

Returns a number at least zero, at most max.

pub fn pick_usize(&mut self, max: usize) -> usize[src]

Returns a number at least zero, at most max.

This returns a usize, but internally it only uses u32 so avoid consensus problems.

pub fn pick_item<'a, T>(&mut self, items: &'a [T]) -> Option<&'a T>[src]

Pick a random element from an array of items.

This is guaranteed to return Some except in the case that the given array items is empty.

Trait Implementations

impl<Hashing: Hash> Decode for RandomNumberGenerator<Hashing> where
    Hashing::Output: Decode,
    Hashing::Output: Decode
[src]

impl<Hashing: Hash> Encode for RandomNumberGenerator<Hashing> where
    Hashing::Output: Encode,
    Hashing::Output: Encode
[src]

impl<Hashing: Hash> EncodeLike<RandomNumberGenerator<Hashing>> for RandomNumberGenerator<Hashing> where
    Hashing::Output: Encode,
    Hashing::Output: Encode
[src]

Auto Trait Implementations

impl<Hashing> RefUnwindSafe for RandomNumberGenerator<Hashing> where
    <Hashing as Hash>::Output: RefUnwindSafe

impl<Hashing> Send for RandomNumberGenerator<Hashing> where
    <Hashing as Hash>::Output: Send

impl<Hashing> Sync for RandomNumberGenerator<Hashing> where
    <Hashing as Hash>::Output: Sync

impl<Hashing> Unpin for RandomNumberGenerator<Hashing> where
    <Hashing as Hash>::Output: Unpin

impl<Hashing> UnwindSafe for RandomNumberGenerator<Hashing> where
    <Hashing as Hash>::Output: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> CheckedConversion for T[src]

impl<S> Codec for S where
    S: Encode + Decode
[src]

impl<T, X> Decode for X where
    T: Decode + Into<X>,
    X: WrapperTypeDecode<Wrapped = T>, 
[src]

impl<T> DecodeAll for T where
    T: Decode
[src]

impl<T> DecodeLimit for T where
    T: Decode
[src]

impl<T, X> Encode for X where
    T: Encode + ?Sized,
    X: WrapperTypeEncode<Target = T>, 
[src]

impl<'_, '_, T> EncodeLike<&'_ &'_ T> for T where
    T: Encode
[src]

impl<'_, T> EncodeLike<&'_ T> for T where
    T: Encode
[src]

impl<'_, T> EncodeLike<&'_ mut T> for T where
    T: Encode
[src]

impl<T> EncodeLike<Arc<T>> for T where
    T: Encode
[src]

impl<T> EncodeLike<Box<T>> for T where
    T: Encode
[src]

impl<T> EncodeLike<Rc<T>> for T where
    T: Encode
[src]

impl<T> From<T> for T[src]

impl<S> FullCodec for S where
    S: Decode + FullEncode
[src]

impl<S> FullEncode for S where
    S: Encode + EncodeLike<S>, 
[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T, Outer> IsWrappedBy<Outer> for T where
    Outer: AsRef<T> + AsMut<T> + From<T>,
    T: From<Outer>, 
[src]

fn from_ref(outer: &Outer) -> &T[src]

Get a reference to the inner from the outer.

fn from_mut(outer: &mut Outer) -> &mut T[src]

Get a mutable reference to the inner from the outer.

impl<T> KeyedVec for T where
    T: Codec
[src]

impl<T> MaybeRefUnwindSafe for T where
    T: RefUnwindSafe
[src]

impl<T> Same<T> for T[src]

type Output = T

Should always be Self

impl<T> SaturatedConversion for T[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

impl<S, T> UncheckedInto<T> for S where
    T: UncheckedFrom<S>, 
[src]

impl<T, S> UniqueSaturatedInto<T> for S where
    S: TryInto<T>,
    T: Bounded
[src]

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 
[src]