[Issue 5249] Strongly pure random generator
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sun Nov 21 20:05:15 PST 2010
http://d.puremagic.com/issues/show_bug.cgi?id=5249
--- Comment #3 from bearophile_hugs at 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: -------
More information about the Digitalmars-d-bugs
mailing list