我的 MRG32k3a 算法实现返回超出预期 [0,1] 范围的数字

问题描述 投票:0回答:1

我正在编写自己的 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]。我不知道从这里到哪里才能使其按预期工作

c# random
1个回答
0
投票

似乎使用无符号变量更好:

...
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.