The lower-order bits have a shorter period so you should use `cast(uint)(rng_state >> 16)` here.
What about using [minstd_rand](http://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use) ([std.random.MinstdRand](http://dlang.org/library/std/random/MinstdRand.html)) instead?