我在线性同余发生器上工作。 公式是:
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;
}
在最后两行代码中,我不理解运算符和运算符的用法。和>>。如果有人可以帮助我,我会很感激。
答案 0 :(得分:2)
第一个"&"正在做" mod"在你的公式中,m = 2 ^ 32。 (据推测这是针对64位int架构的,因为它对于32位整数来说是无操作。)
第二行是整数除以2 ^ 16,然后是(mod 2 ^ 15) - 数学等价于(seed / 65536)%32768。
计算这些的替代方法的原因是那些"按位"的几乎确定的时间效率。运营商相当于#34;数学"操作