17.1 tuple 类型

  • tuple 是一种快速而随意的数据结构
  • 一个 tuple 可以有任意数量的成员,当我们希望一些数据组合成单一对象,又不想麻烦定义一个新数据结构时,会使用 tuple
  • tie 可以解包 tuple[1]
    1. tie(y_parent, y_depth, y_found) = tuple{parent, depth, true};

    17.4 随机数

    C 库函数 rand 存在的问题

    很多程序需要不同范围的随机数,有些程序需要随机浮点数,有些程序需要非均匀分布的数。为解决这些问题,试图转换 rand 生成的随机数范围、类型、分布时,常常会引入非随机性。

    定义在头文件 random 中的随机数库通过一组协作的类可以解决这些问题:随机数引擎类+随机数分布类

    • 引擎类:生成 unsigned 原始随机数序列
    • 分布类:使用引擎类生成指定类型、范围、分布的随机数

17.4.1 随机数引擎和分布的使用方法

a. 生成不设置分布的原始随机数

  1. #include <iostream>
  2. #include <random>
  3. using namespace std;
  4. int main() {
  5. default_random_engine e; // 引擎类
  6. for (size_t i = 0; i < 10; ++i)
  7. cout << e() << endl;
  8. return 0;
  9. }
  1. 16807
  2. 282475249
  3. 1622650073
  4. 984943658
  5. 1144108930
  6. 470211272
  7. 101027544
  8. 1457850878
  9. 1458777923
  10. 2007237709

b. 生成均匀分布的范围 0~9 的 unsigned 值

  • 注意传递给分布对象的是引擎对象本身,而不是 e 生成的值,所以应该 u(e) ```cpp

    include

    include

using namespace std;

int main() { uniform_int_distribution u(0,9); // 分布类 default_random_engine e; // 引擎类 for (size_t i = 0; i < 10; ++i) cout << u(e) << endl; return 0; }

  1. ```
  2. 0
  3. 1
  4. 7
  5. 4
  6. 5
  7. 2
  8. 0
  9. 6
  10. 6
  11. 9

c. 设置随机数发生器种子(seed)

  • 注意:
    • 多跑几次上述的代码,可以发现,每次生成的随机数序列其实都是一样的。因为一个给定的随机数发生器一定会生成相同的随机数序列
    • 一个函数如果定义了一个局部的随机数发生器,应将其(包括引擎和分布对象)定义为 static 的,否则每次都会生成相同的序列
  • 为引擎设置种子的两种方式:

    • 创建引擎对象时提供种子

      1. default_random_engine e(12345);
    • 调用引擎的 seed 成员

      1. default_random_engine e;
      2. e.seed(12345);

      17.4.2

      参考

  1. https://zh.cppreference.com/w/cpp/utility/tuple/tie