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

标签 c++ c algorithm math

在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/

相关文章:

c++ - 交错插入排序函数排序不正确

C 程序有时崩溃有时不崩溃

c++ - 静态分配的内存在其范围结束后会发生什么?

c - 段错误——无法理解错误的原因

algorithm - 选择 N 个项目,使其属性平衡

c++ - Qt 和 LibEvent 中信号和槽的区别

C++:Qt 5.3 无法显示 UTF-8 字符

c - C 中查找数组中最小数字的算法

c++ - 对现有类的 undefined reference

arrays - 打印数组中的 K 个最小数字(不是第 k 个最小的)