我正在研究线性同余生成器。
公式为:
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。
之所以选择这些替代方法,是因为这些“按位”运算符相对于等效的“数学”运算几乎具有一定的时间效率。