我正在编写自己的 MRG32k3a 算法实现,返回值应该来自 [0,1] 返回值 > 1
static double rand()
{
double x = 0;
long seed1 = DateTime.Now.Year;
long seed2 = DateTime.Now.Month;
long seed3 = DateTime.Now.Day;
long seed4 = DateTime.Now.Hour;
long seed5 = DateTime.Now.Minute;
long seed6 = DateTime.Now.Second;
long m1 = 4294967296 - 209;
long m2 = 4294967296 - 22853;
long A1 = ((1403580 * seed2) - (810728 * seed1)) % m1;
long A2 = ((1403580 * seed3) - (810728 * seed2)) % m1;
long Ai = ((1403580 * A2) - (810728 * A1)) % m1;
long B1 = ((527612 * seed6) - (1370589 * seed4)) % m2;
long B2 = ((527612 * B1) - (1370589 * seed5)) % m2;
long B3 = ((527612 * B2) - (1370589 * seed6)) % m2;
long Bi = ((527612 * B3) - (1370589 * B1)) % m2;
if (Ai < Bi) { x = Ai - Bi + m1; }
else if (Ai >= Bi) { x = Ai - Bi; }
x = (x / m1);
return x;
}
我尝试了多种归一化想法,其中我添加了 m1 和 m2 的模数,它没有导致任何变化,类似地,我尝试将种子更改为当前刻度/以前的种子,即
long seed1 = DateTime.Now.Ticks / DateTime.Now.Year
并将范围从 [0,1 ] 到 [-1,1]。我不知道从这里到哪里才能使其按预期工作
似乎使用无符号变量更好:
...
unchecked
{
ulong A1 = ((1403580 * seed2) - (810728 * seed1)) % m1;
ulong A2 = ((1403580 * seed3) - (810728 * seed2)) % m1;
ulong Ai = ((1403580 * A2) - (810728 * A1)) % m1;
ulong B1 = ((527612 * seed6) - (1370589 * seed4)) % m2;
ulong B2 = ((527612 * B1) - (1370589 * seed5)) % m2;
ulong B3 = ((527612 * B2) - (1370589 * seed6)) % m2;
ulong Bi = ((527612 * B3) - (1370589 * B1)) % m2;
if (Ai < Bi) { x = Ai - Bi + m1; }
else if (Ai >= Bi) { x = Ai - Bi; }
x = (x / m1);
return x;
}