17.1 tuple 类型
- tuple 是一种快速而随意的数据结构
- 一个 tuple 可以有任意数量的成员,当我们希望一些数据组合成单一对象,又不想麻烦定义一个新数据结构时,会使用 tuple
- tie 可以解包 tuple[1]
tie(y_parent, y_depth, y_found) = tuple{parent, depth, true};
17.4 随机数
C 库函数 rand 存在的问题
很多程序需要不同范围的随机数,有些程序需要随机浮点数,有些程序需要非均匀分布的数。为解决这些问题,试图转换 rand 生成的随机数范围、类型、分布时,常常会引入非随机性。定义在头文件 random 中的随机数库通过一组协作的类可以解决这些问题:随机数引擎类+随机数分布类
- 引擎类:生成 unsigned 原始随机数序列
- 分布类:使用引擎类生成指定类型、范围、分布的随机数
17.4.1 随机数引擎和分布的使用方法
a. 生成不设置分布的原始随机数
#include <iostream>
#include <random>
using namespace std;
int main() {
default_random_engine e; // 引擎类
for (size_t i = 0; i < 10; ++i)
cout << e() << endl;
return 0;
}
16807
282475249
1622650073
984943658
1144108930
470211272
101027544
1457850878
1458777923
2007237709
b. 生成均匀分布的范围 0~9 的 unsigned 值
using namespace std;
int main() {
uniform_int_distribution
```
0
1
7
4
5
2
0
6
6
9
c. 设置随机数发生器种子(seed)
- 注意:
- 多跑几次上述的代码,可以发现,每次生成的随机数序列其实都是一样的。因为一个给定的随机数发生器一定会生成相同的随机数序列。
- 一个函数如果定义了一个局部的随机数发生器,应将其(包括引擎和分布对象)定义为 static 的,否则每次都会生成相同的序列
为引擎设置种子的两种方式: