在C/C++中,当我们想获取随机整数时,通常使用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”,则可能不会遇到很多随机性。
该方案称为linear congruential。