在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

09-18 08:49