线性同余发生器,运算符&和>>在C ++中

时间:2015-10-11 10:34:09

标签: c++ algorithm random

我在线性同余发生器上工作。 公式是:

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

我在C ++中发现了一段实现LCG的代码:

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;
}

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

1 个答案:

答案 0 :(得分:2)

第一个"&"正在做" mod"在你的公式中,m = 2 ^ 32。 (据推测这是针对64位int架构的,因为它对于32位整数来说是无操作。)

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

计算这些的替代方法的原因是那些"按位"的几乎确定的时间效率。运营商相当于#34;数学"操作