| /** | |
| * 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; | |
| } |