【发布时间】:2015-10-11 10:34:08
【问题描述】:
我正在研究线性同余生成器。 公式为:
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;
}
在最后两行代码中,我不明白运算符&和>>的用法。如果有人可以帮助我,我将不胜感激。
【问题讨论】:
-
您不了解这些运算符,或者您不了解它们在这种情况下的应用吗?
-
当然,在这种情况下。
-
最后一个运算符将生成的随机值除以 2^16。比通过应用位掩码剪切最后一位。这可能用于选择生成值的特定部分。
-
第一个
&没用。即使unsigned int有“太多位”,它们也无法影响低位。只有低 31 位才重要。