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

moo*_*key 11 c c++ algorithm math

在C/C++,rand()srand()通常使用的我们,当我们希望得到一个随机整数.但是当我试图自己重写它时,我发现很难理解算法.这个函数很容易写成几行,但公式是误解.

主要配方:

ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L;
Run Code Online (Sandbox Code Playgroud)

原始代码涉及:

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 );
}
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 18

它只是模数运算.你是乘以并加上一个以2 ^ 32为模的数字(例如),并将高16位作为"随机"数返回.因为您正在增加并添加与模数相互作用的数字,所以这会创建一些均匀分布的数字.

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

该方案称为线性同余.