Skip to main content

SplitMix64

Struct SplitMix64 

Source
pub struct SplitMix64 { /* private fields */ }
Expand description

SplitMix64 generator (Steele, Lea & Flood 2014).

A single-u64-state PRNG chosen for its tiny, portable, branch-free core: it produces a byte-identical stream for a given seed on every platform, which the equivalence harness relies on. That cross-platform guarantee covers next_u64 and next_f64, which are integer arithmetic plus one exact division by a power of two; it stops at standard_normal, whose Box–Muller transform routes through the platform math library — see that method’s portability note. The generator also caches the second Box–Muller variate, so standard_normal costs one transcendental pair per two draws.

Implementations§

Source§

impl SplitMix64

Source

pub const fn new(seed: u64) -> Self

Creates a generator seeded with seed.

§Arguments
  • seed — initial state; any u64 is valid (including 0).
Source

pub const fn next_u64(&mut self) -> u64

Draws the next 64-bit value and advances the state.

§Returns

A pseudo-random u64 uniformly distributed over the full range.

Source

pub fn next_f64(&mut self) -> f64

Draws a uniform value in [0, 1) with 53 bits of resolution.

§Returns

A pseudo-random f64 in the half-open unit interval.

Source

pub fn standard_normal(&mut self) -> f64

Draws a standard-normal variate via Box–Muller, caching the spare.

The transform produces two independent N(0,1) variates per call; the second is cached and returned on the following call, halving the transcendental cost over a long stream.

§Portability

The draw is deterministic: one seed gives one sequence, and the u64 stream underneath it is byte-identical on every target. The variate itself is not. Box–Muller evaluates ln, sin, and cos through the platform math library, which is accurate to well under an ulp but is not correctly rounded, so different targets — and even different optimisation levels on one target — can disagree in the last ulp or two. Compare standard-normal draws, and any statistic accumulated from them, with a tolerance; never bit-for-bit across builds or machines.

§Returns

A pseudo-random f64 distributed as N(0, 1).

Trait Implementations§

Source§

impl Clone for SplitMix64

Source§

fn clone(&self) -> SplitMix64

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SplitMix64

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

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

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.