一尘不染

了解Visual C ++ rand()函数的算法

algorithm

在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 );
}

阅读 214

收藏
2020-07-28

共1个答案

一尘不染

这只是模块化算法。您将乘以并乘以一个以2 ^
32为模的数字(例如),然后将高16位作为“随机”数字返回。因为您要乘以和添加模数互质的数字,所以会创建一种均匀分布的数字。

仔细选择两个数字非常重要。例如,如果您使用“ * 4”和“ + 8”,则可能不会遇到很多随机性。

这种方案称为线性同余

2020-07-28