首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

random_shuffle 算法詳解:通用、高效的序列隨機化利器

     編輯:關於C++

為什麼不直接用 rand()?

  • 分布失真:取模運算導致某些數字出現機率較高。
  • 型別侷限:僅支援整數,無法直接產生字元、浮點數、字串、資料庫記錄等隨機序列。

核心思想:打亂有序序列

  1. 建立包含所有目標值的有序容器(vector、陣列)。
  2. 呼叫 std::random_shuffle 重新排列元素順序。
  3. 依序取用即得隨機序列,且保證無重複、分布均勻。

基本用法:vector 整數隨機排列


#include 
#include 
#include 

int main() {
    std::vector vi;
    for (int i = 0; i < 100; ++i) vi.push_back(i);  // 0~99 有序填充

    std::random_shuffle(vi.begin(), vi.end());      // 打亂順序

    for (int i = 0; i < 100; ++i) std::cout << vi[i] << ' ';
}

random_shuffle 定義於 <algorithm>,參數為迭代器範圍 [first, last)。

泛型威力:任意型別、任意容器

字串向量:一周隨機順序


#include 
#include 
#include 
#include 

int main() {
    std::vector vs = {"Sunday","Monday","Tuesday","Wednesday",
                                   "Thursday","Friday","Saturday"};
    std::random_shuffle(vs.begin(), vs.end());
    for (const auto& s : vs) std::cout << s << '\n';
}

內建陣列:字元隨機排列


char carr[4] = {'a','b','c','d'};
std::random_shuffle(carr, carr+4);  // 指標即迭代器,carr+4 指向尾後
for (int i = 0; i < 4; ++i) std::cout << carr[i] << ' ';

進階應用場景

  • 撲克牌洗牌:vector 初始化 52 張牌 → random_shuffle。
  • 測試資料隨機化:測試案例順序打亂,避免順序相依 Bug。
  • 負載均衡:伺服器列表隨機排序後輪詢。
  • 密碼學非適用:random_shuffle 預設使用 rand(),非密碼學安全。需安全隨機請用 std::shuffle + std::random_device/std::mt19937(C++11)。

C++11/14/17 現代化建議


// C++11 起推薦使用 shuffle + 隨機引擎
#include 
#include 

std::mt19937 rng(std::random_device{}());
std::shuffle(vi.begin(), vi.end(), rng);  // 更好的隨機品質、可重現種子

random_shuffle 在 C++14 棄用,C++17 移除。新專案請直接使用 std::shuffle。

總結

random_shuffle(及其繼任者 shuffle)以打亂有序序列的巧妙思路,解決了傳統隨機數生成的分布失真與型別侷限問題。其泛型設計支援任意可變更序列容器與元素型別,是 C++ 標準庫中極具實用價值的算法之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved