1. 场景: rand 生成随机数
此函数生成均匀分布的伪随机整数, 每个随机数的范围在 0 和一个系统相关的最大值( 至少为 32767) 之间。
1.1 问题:
- 一些应用需要随机浮点数。
- 一些程序需要非均匀分布的数。
2. 解决方法:随机数库
随机数库的组成
- 随机数引擎类( random-number engines)
生成随机 unsigned 整数序列 - 随机数分布类(random-number distribution)
使用引擎返回服从特定概率分布的随机数
2.1 随机数引擎和分布
随机数引擎是函数对象类, 它们定义了一个调用运算符,该运算符不接受参数并返回一个随机 unsigned 整数。 我们可以通过调用一个随机数引擎对象来生成原始随机数
default_random_engine e; // 生成随机无符号数 for (size_ti = 0;i < 10; ++i) //e(T)"调用"对象来生成下一个随机数 cout << e() <<" ";
输出:
16807 282475249 1622650073 984943658 1144108930 470211272…
2.2 随机数引擎操作
| 操作 | 解释 |
|---|---|
| Engine e; | 默认构造函数;使用该引擎类型默认的种子 |
| Engine e(s); | 使用整型值s作为种子 |
| e.seed(s) | 使用种子s重置引擎的状态 |
| e.min(),e.max() | 此引擎可生成的最小值和最大值 |
| Engine::result_type | 此引擎生成的unsigned整型类型 |
| e.discard(u) | 将引擎推进u步;u的类型为unsigned long long |
2.3 分布类型和引擎
随机数发生器时, 是指分布对象和引擎对象的组合。
eg.为了得到在一个指定范围内的数, 我们使用一个分布类型的对象
// 初始化分布类型 // 生成0到 9 之间(包含)均匀分布的随机数 uniform_int_distributionu(0, 9); // 初始化引擎 default_random_engine e; // 随机生成0-9的无符号整数 cout << u(e) << endl;
输出
0 1 7 4 5 2 0 6 6 9
2.3.1 设置随机数发生器种子
种子就是一个数值,引擎可以利用它从序列中一个新位置重新开始生成随机数。
- 种子可以使用系统函数time(0)。
- 其他随机数分布
2.3.2 分布类型的操作
| 操作 | 解释 |
|---|---|
| Dist d; | 默认够赞函数;使d准备好被使用。其他构造函数依赖于Dist的类型;分布类型的构造函数是explicit的。 |
| d(e) | 用相同的e连续调用d的话,会根据d的分布式类型生成一个随机数序列;e是一个随机数引擎对象。 |
| d.min(),d.max() | 返回d(e)能生成的最小值和最大值。 |
| d.reset() | 重建d的状态,是的随后对d的使用不依赖于d已经生成的值。 |



