/** * Random number generators for internal usage. * * Copyright: Copyright Digital Mars 2014. * License: $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0). */ module rt.util.random; struct Rand48 { private ulong rng_state; @safe @nogc nothrow: void defaultSeed() { import ctime = core.stdc.time : time; seed(cast(uint)ctime.time(null)); } pure: void seed(uint seedval) { assert(seedval); rng_state = cast(ulong)seedval << 16 | 0x330e; popFront(); } auto opCall() { auto result = front; popFront(); return result; } @property uint front() { return cast(uint)(rng_state >> 16); } void popFront() { immutable ulong a = 25214903917; immutable ulong c = 11; immutable ulong m_mask = (1uL << 48uL) - 1; rng_state = (a*rng_state+c) & m_mask; } enum empty = false; }