1/**
2 * Random number generators for internal usage.
3 *
4 * Copyright: Copyright Digital Mars 2014.
5 * License:   $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
6 */
7module rt.util.random;
8
9struct Rand48
10{
11    private ulong rng_state;
12
13@safe @nogc nothrow:
14
15    void defaultSeed()
16    {
17        import ctime = core.stdc.time : time;
18        seed(cast(uint)ctime.time(null));
19    }
20
21pure:
22
23    void seed(uint seedval)
24    {
25        assert(seedval);
26        rng_state = cast(ulong)seedval << 16 | 0x330e;
27        popFront();
28    }
29
30    auto opCall()
31    {
32        auto result = front;
33        popFront();
34        return result;
35    }
36
37    @property uint front()
38    {
39        return cast(uint)(rng_state >> 16);
40    }
41
42    void popFront()
43    {
44        immutable ulong a = 25214903917;
45        immutable ulong c = 11;
46        immutable ulong m_mask = (1uL << 48uL) - 1;
47        rng_state = (a*rng_state+c) & m_mask;
48    }
49
50    enum empty = false;
51}
52