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);
}());