在C / C ++,rand()和srand()通常使用的我们,当我们希望得到一个随机整数。但是当我尝试自己重写它时,我发现很难理解该算法。仅用几行就可以很容易地编写该函数,但是公式存在误解。
rand()
srand()
主要公式:
ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L;
原始代码涉及:
void __cdecl srand (unsigned int seed) { _getptd()->_holdrand = (unsigned long)seed; } int __cdecl rand (void) { _ptiddata ptd = _getptd(); return ( ((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) & 0x7fff ); }
这只是模块化算法。您将乘以并乘以一个以2 ^ 32为模的数字(例如),然后将高16位作为“随机”数字返回。因为您要乘以和添加模数互质的数字,所以会创建一种均匀分布的数字。
仔细选择两个数字非常重要。例如,如果您使用“ * 4”和“ + 8”,则可能不会遇到很多随机性。
这种方案称为线性同余。