我正在研究线性同余生成器。
公式为:

Xn+1 = (a * Xn + c) mod m

我在实现LCG的C++中发现了这样一段代码:
class LCG {
public:
    LCG();
    LCG(unsigned int newSeed);
    ~LCG();
    void setSeed(unsigned int newSeed);
    unsigned int getSeed(void);
    unsigned int next(void);
private:
    unsigned int seed;
    const static unsigned int a = 214013U;
    const static unsigned int c = 2531011U;
};

LCG::LCG() { seed = 1; }
LCG::LCG(unsigned int newSeed) { setSeed(newSeed); }
LCG::~LCG() { }
void LCG::setSeed(unsigned int newSeed) { seed = newSeed; }
unsigned int LCG::getSeed(void) { return seed; }
unsigned int LCG::next(void) {
    seed = (seed * a + c) & 0xffffffff;
    return (seed >> 16) & 0x7fff;
}

在最后两行代码中,我不了解运算符&和>>的用法。如果有人可以帮助我,我将不胜感激。

最佳答案

第一个“&”是您公式中的“mod”,m = 2 ^ 32。 (大概这是针对64位int架构的,因为对于32位int来说这是一个空操作。)

第二行是整数除以2 ^ 16,然后是(mod 2 ^ 15)-数学上等于(seed / 65536)%32768。

之所以选择这些替代方法,是因为这些“按位”运算符相对于等效的“数学”运算几乎具有一定的时间效率。

10-08 15:13