SplitMix64

What it is

SplitMix64 (Steele; recommended by Vigna for seeding) is a tiny, fast 64-bit generator built from a Weyl sequence (the state is bumped by the golden-ratio constant each call) followed by an avalanche mix. Its period is 264.

When to use it

SplitMix64 is a seeding helper, not a general-purpose engine. simdrng uses it internally to expand a single 64-bit seed into the larger state of the other generators, so that even low-entropy seeds (0, 1, …) produce well-distributed starting states. Use it directly when you need to derive several independent 64-bit seeds from one master seed; for actual random streams use Xoshiro256++, Philox, or ChaCha.

Scalar only

SplitMix64 has a single scalar implementation — there is no SIMD-dispatch or -march=native variant, because it exists to seed the other engines rather than to produce bulk output.

#include <simdrng/splitmix.hpp>

simdrng::SplitMix sm(seed);
std::uint64_t a = sm();            // a derived seed
std::uint64_t b = sm();            // another, independent of a

Each call advances the state and returns the next mixed value, so successive calls yield independent 64-bit seeds.

Periods and streams

SplitMix64 has a period of 264. simdrng uses it only to expand a 64-bit seed into the larger state of the other engines. See Generator properties for the full period table.

References

Using SplitMix64 to seed the other generators follows S. Vigna’s explicit recommendation (https://prng.di.unimi.it/), quoted under Seeding. See References.