http://d.puremagic.com/issues/show_bug.cgi?id=5249
--- Comment #3 from bearophile_h...@eml.cc 2010-11-21 20:03:55 PST --- A bit more realistic (but not complete, not commented, etc) test using one of the rnd generator of the std.random module: pure nothrow UIntType pureLinearCongruential(UIntType, UIntType a, UIntType c, UIntType m) (UIntType x0) { // perform compile-time tests on a, c, m here... static if (m) { UIntType _x = x0 % m; // slow? static if (is(UIntType == uint) && m == uint.max) { immutable ulong x = (cast(ulong) a * _x + c); immutable ulong v = x >> 32; immutable ulong w = x & uint.max; immutable y = cast(uint)(v + w); _x = (y < v || y == uint.max) ? (y + 1) : y; } else static if (is(UIntType == uint) && m == int.max) { immutable ulong x = (cast(ulong) a * _x + c); immutable ulong v = x >> 31; immutable ulong w = x & int.max; immutable uint y = cast(uint)(v + w); _x = (y >= int.max) ? (y - int.max) : y; } else { _x = cast(UIntType) ((cast(ulong) a * _x + c) % m); } } else { UIntType _x = a * _x0 + c; } return _x; } alias pureLinearCongruential!(uint, 16807, 0, 2147483647) pureMinstdRand0; import std.stdio: writeln; void main() { uint rnd = 100000; foreach (_; 0 .. 10) { rnd = pureMinstdRand0(rnd); writeln(rnd); } } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------