This is a _potential_ enhancement request. A wrong D2 program: import std.stdio, std.random; void foo(RND)(RND rnd) { foreach (i; 0 .. 5) write(uniform(0, 10, rnd), " "); writeln(); } void main() { auto rnd = Xorshift(1); foo(rnd); foo(rnd); } DMD 2.054 output: 3 1 2 7 5 3 1 2 7 5 The mistake is a missing ref, that causes foo to not return an updated random generator, so it always generate the same random values: void foo(RND)(ref RND rnd) { To avoid this bug (that I think is common enough), I suggest to experiment if it's performance-wide possibile to turn all random generators into reference things, that is final class instances, that don't require that "ref".
See also issue 7067
Joe has done an excellent talk about this problem on DConf15: http://dconf.org/2015/talks/wakeling.html
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/phobos/issues/9910 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB