线性全等发电机,运算符和>>C++

Linear Congruential Generator, operators & and >> in C++

本文关键字:gt C++ 运算符 发电机 线性      更新时间:2023-10-16

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

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

在最后两行代码中,我不明白操作符&和>>。如果有人能帮助我,我将不胜感激。

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

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

选择其他计算方法的原因是这些"按位"运算符比等效的"数学"运算符几乎肯定具有时间效率。