这是一个 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 的特性,但首先想看看是否有任何现有的文献。