modernize-replace-random-shuffle

此检查将查找 std::random_shuffle 的出现并将其替换为 std::shuffle。在 C++17 中,std::random_shuffle 将不再可用,因此我们需要将其替换。

以下是将要查找的出现类型的两个示例,以及将要替换为的两个示例。

std::vector<int> v;

// First example
std::random_shuffle(vec.begin(), vec.end());

// Second example
std::random_shuffle(vec.begin(), vec.end(), randomFunc);

这两个示例都将被替换为

std::shuffle(vec.begin(), vec.end(), std::mt19937(std::random_device()()));

第二个示例还将收到一个警告,指出 randomFunc 的支持方式与以前不同,因此如果用户希望获得相同的功能,则需要更改 randomFunc 的实现。

需要注意的是,std::random_device 的初始化非常昂贵。因此,如果在性能关键的代码中使用它,可能需要在其他地方进行初始化。另一件事是,建议的修复的种子质量很差:std::mt19937 的内部状态为 624 个 32 位整数,但只用一个整数进行种子。因此,如果需要更高的随机性质量,应考虑更好的种子,例如

std::shuffle(v.begin(), v.end(), []() {
  std::mt19937::result_type seeds[std::mt19937::state_size];
  std::random_device device;
  std::uniform_int_distribution<typename std::mt19937::result_type> dist;
  std::generate(std::begin(seeds), std::end(seeds), [&] { return dist(device); });
  std::seed_seq seq(std::begin(seeds), std::end(seeds));
  return std::mt19937(seq);
}());