在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 .
关于c++ - 理解Visual C++的rand()函数的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6793065/