C++中std::shuffle的使用小結(jié)
std::shuffle 的使用
std::shuffle
是 C++ 標準庫中的一個函數(shù),用于對容器中的元素進行隨機排列(洗牌)。它的實現(xiàn)基于現(xiàn)代隨機數(shù)生成器,因此比 std::random_shuffle
更安全和靈活(std::random_shuffle
在 C++14 被棄用,C++17 后被移除)。
1. 語法
#include <algorithm> #include <random> std::shuffle(RandomIt first, RandomIt last, URBG&& g);
first
和last
:表示要隨機打亂的范圍([first, last)
)。g
:隨機數(shù)生成器,必須符合 UniformRandomBitGenerator(如std::mt19937
)。- 返回值:無(函數(shù)會直接修改輸入范圍的內(nèi)容)。
2. 使用示例
#include <iostream> #include <vector> #include <algorithm> #include <random> // 需要包含 <random> 頭文件 int main() { std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9}; // 創(chuàng)建隨機數(shù)生成器 std::random_device rd; // 隨機設備(硬件熵源) std::mt19937 g(rd()); // 梅森旋轉(zhuǎn)算法(常用的隨機數(shù)引擎) // 打亂順序 std::shuffle(vec.begin(), vec.end(), g); // 輸出打亂后的結(jié)果 std::cout << "Shuffled vector: "; for (int num : vec) { std::cout << num << " "; } std::cout << std::endl; return 0; }
3. 代碼解析
創(chuàng)建隨機數(shù)生成器
std::random_device rd;
:用于生成種子。std::mt19937 g(rd());
:使用梅森旋轉(zhuǎn)算法(Mersenne Twister)作為偽隨機數(shù)引擎。
調(diào)用
std::shuffle
進行洗牌std::shuffle(vec.begin(), vec.end(), g);
重新打亂vec
中的元素順序。
打印打亂后的數(shù)組
- 遍歷并輸出
vec
。
- 遍歷并輸出
4. 示例輸出
Shuffled vector: 3 7 5 9 1 4 2 8 6
(輸出的順序是隨機的,每次運行結(jié)果可能不同。)
5. 重要說明
為什么不用 std::random_shuffle
?
std::random_shuffle
需要內(nèi)部調(diào)用rand()
,它的隨機性較弱,而且rand()
不是線程安全的。std::shuffle
允許使用高質(zhì)量的隨機數(shù)生成器(如std::mt19937
)。
std::mt19937
vs std::default_random_engine
std::default_random_engine
可能因不同的編譯器實現(xiàn)不同,因此推薦使用std::mt19937
。
如何使用固定種子進行可復現(xiàn)的隨機洗牌?
std::mt19937 g(42); // 42 作為固定的隨機種子 std::shuffle(vec.begin(), vec.end(), g);
這樣每次運行代碼都會得到相同的打亂結(jié)果。
6. 適用場景
- 隨機排序數(shù)據(jù)
- 生成隨機測試用例
- 洗牌(如撲克牌游戲)
- 打亂數(shù)據(jù)以避免排序偏差(如機器學習數(shù)據(jù)預處理)
7. 結(jié)論
std::shuffle 是現(xiàn)代 C++ 中推薦的隨機洗牌方法,結(jié)合 std::mt19937 可以提供高質(zhì)量的隨機性,適用于各種隨機排列的場景。
?? 推薦使用 std::shuffle 代替 std::random_shuffle,并搭配 std::mt19937 以獲得更好的隨機性和可控性!
到此這篇關于C++中std::shuffle的使用小結(jié)的文章就介紹到這了,更多相關C++ std::shuffle內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
c++ 虛函數(shù)與純虛函數(shù)的區(qū)別(深入分析)
本篇文章是對c++中虛函數(shù)與純虛函數(shù)的區(qū)別進行了詳細的分析介紹,需要的朋友參考下2013-05-05C++11正則表達式詳解(regex_match、regex_search和regex_replace)
正則表達式(regular expression)是計算機科學中的一個概念,又稱規(guī)則表達式,下面這篇文章主要介紹了C++11正則表達式(regex_match、regex_search和regex_replace)的相關資料,需要的朋友可以參考下2022-09-09