这是什么PRNG功能?

计算科学 算法 C 随机数生成 集会
2021-12-22 16:48:13

这是一个 16 位 PRNG 函数,从汇编转录为 C 以便于阅读:

#define LOW(exp)  ((exp) & 0x00FF)
#define HIGH(exp) (((exp) & 0xFF00) >> 8)

uint16_t prng(uint16_t v) {

    uint16_t low  = LOW(v);
    uint16_t high = HIGH(v);

    uint16_t mul_low  = low  * 5;
    uint16_t mul_high = high * 5;

    // need to check for overflow, since final addition is adc as well
    uint16_t v1    = LOW(mul_high) + HIGH(mul_low) + 1;
    uint8_t  carry = HIGH(v1) ? 1 : 0;

    uint16_t v2 = (LOW(v1) << 8) + LOW(mul_low);

    return (v2 + 0x11 + carry);
}

根据@EternisedDragon 的说法,@sagara 的原始转录;我的小修改。汇编和一些解释可在https://stackoverflow.com/questions/36745601/how-is-the-carry-flag-being-set-in-this-assembly-code获得。

我一直在尝试识别这个 PRNG,想知道它是否属于一个共同的分类。我一直在浏览维基百科的随机数生成器列表,比如线性反馈移位寄存器算法,但所有这些似乎都比上面的简单函数复杂得多。

这个功能对任何人来说都很熟悉吗?

我想研究这个 PRNG 的特性,但首先想看看是否有任何现有的文献。

1个回答

稍微玩一下 C 代码生成的数字序列,可以看出该序列是

zi+1=5zi+273mod216

这是一个线性同余生成器(LCG)。很容易证明这个 LCG 有全周期(参见 Law's Simulation Modeling and Analysis, 5th ed.中的定理 7.1并检查三个条件。)

我在我检查的任何参考文献中都找不到生成器,但这并不意味着它没有在某处发布。它将遭受其他 LCG 的所有故障(特别是它在更高维度的均匀性测试中表现不佳。)