random_shuffle 是 STL 中經典的隨機排列算法,可將任意隨機訪問迭代器範圍內的元素隨機重排。本文講解用法、實現原理、C++11/14/17 演進與替代方案。
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
int main() {
std::vector<std::string> days = {"Sunday", "Monday", "Tuesday",
"Wednesday", "Thursday", "Friday", "Saturday"};
std::random_shuffle(days.begin(), days.end()); // 打亂順序
for (const auto& d : days) std::cout << d << ' ';
// 輸出示例:Thursday Sunday Wednesday Monday Saturday Tuesday Friday
}
vector、deque、array、指針)
std::random_shuffle(v.begin(), v.end(), [](){ return std::rand() % N; }); // 非推薦
// 或
struct MyRand { int operator()(int n) { return std::rand() % n; } };
std::random_shuffle(v.begin(), v.end(), MyRand());
⚠️ std::rand() 質量差、非線程安全、取模偏差。
| 標準 | 狀態 | 推薦替代 |
|---|---|---|
| C++98/03 | 標準 | random_shuffle |
| C++11 | 引入 shuffle | std::shuffle + std::mt19937 |
| C++14 | random_shuffle 棄用 | 同上 |
| C++17 | random_shuffle 移除 | 僅 std::shuffle |
#include <random>
#include <algorithm>
std::vector<int> v = {1,2,3,4,5,6,7};
std::mt19937 rng(std::random_device{}()); // 高質量隨機引擎
std::shuffle(v.begin(), v.end(), rng); // 唯一標準方式
優勢:均勻分佈、周期長、線程安全(引擎可局部)、標準合規。
vector、deque、array、string、C 數組list、forward_list、set、map(非隨機訪問迭代器)若需打亂 list,可轉 vector 打亂再轉回,或手動實現 Fisher-Yates。
random_shuffle 是歷史產物,現代 C++ 請直接使用 std::shuffle + std::mt19937。理解 Fisher-Yates 洗牌算法原理(從後向前隨機交換)有助於面試與自定義實現。