1. 从C的rand()到C++11的:现代随机数生成实践指南
那天面试的场景还历历在目——当面试官问及随机数生成时,我条件反射般说出了srand(time(0))和rand()的组合,却对C++11引入的
关键认知:C的rand()不是"不好",而是已经不适合现代C++开发场景。就像用算盘也能算账,但面对Excel表格时,专业工具的价值不言而喻明。
1.1 为什么rand()在C++中已成过去式
先看一个典型rand()使用示例:
cpp复制#include <cstdlib>
#include <ctime>
int main() {
srand(time(0)); // 设置种子
int random_num = rand() % 100; // 生成0-99的随机数
// ...
}
这种写法存在三个致命缺陷:
-
分布不均匀性:当使用取模运算时,如果模数不是RAND_MAX的约数,会产生偏差。例如RAND_MAX=32767时,rand()%100会导致0-67的数字出现概率比68-99高约0.1%。
-
有限周期长度:标准要求rand()的周期至少为2^32,但许多实现仅达到这个下限。对于需要大量随机数的场景(如蒙特卡洛模拟),可能很快出现重复序列。
-
线程安全问题:rand()使用全局状态,多线程环境下需要额外同步措施,而C++11的随机数引擎可以创建线程本地实例。
下表对比两种方式的特性差异:
| 特性 | C rand() | C++11 |
|---|---|---|
| 周期长度 | ≥2^32 | 最高可达2^19937 |
