Skip to main content

Rng

Trait Rng 

Source
pub trait Rng {
    type Seed;

    // Required method
    fn new(seed: Self::Seed) -> Self;

    // Provided method
    fn next<T>(&mut self) -> T
       where Self: RngNext<T> { ... }
}
Expand description

A generic Random number generator

§Example

use common_traits::{Rng, RngNext};

pub struct Xorshift64(u64);

impl Rng for Xorshift64 {
    type Seed = u64;

    fn new(seed: u64) -> Self {
        Self(seed.saturating_add(1))
    }
}

impl RngNext<u64> for Xorshift64 {
    fn next_inner(&mut self) -> u64 {
        self.0 ^= self.0 << 13;
        self.0 ^= self.0 >> 7;
        self.0 ^= self.0 << 17;
        self.0
    }
}

impl RngNext<f64> for Xorshift64 {
    fn next_inner(&mut self) -> f64 {
        let v: u64 = (self.next::<u64>() >> 11) | (1023 << 52);
        let r: f64 = f64::from_le_bytes(v.to_le_bytes());
        r - 1f64
    }
}

Required Associated Types§

Required Methods§

Source

fn new(seed: Self::Seed) -> Self

Instantiate a new Rng making no assumptions on its seed.

Provided Methods§

Source

fn next<T>(&mut self) -> T
where Self: RngNext<T>,

automatic dispatching of the implementation, no need to re-implement

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§