C++中std::shuffle的使用小結(jié)
std::shuffle 的使用
std::shuffle 是 C++ 標(biāo)準(zhǔn)庫(kù)中的一個(gè)函數(shù),用于對(duì)容器中的元素進(jìn)行隨機(jī)排列(洗牌)。它的實(shí)現(xiàn)基于現(xiàn)代隨機(jī)數(shù)生成器,因此比 std::random_shuffle 更安全和靈活(std::random_shuffle 在 C++14 被棄用,C++17 后被移除)。
1. 語(yǔ)法
#include <algorithm> #include <random> std::shuffle(RandomIt first, RandomIt last, URBG&& g);
first和last:表示要隨機(jī)打亂的范圍([first, last))。g:隨機(jī)數(shù)生成器,必須符合 UniformRandomBitGenerator(如std::mt19937)。- 返回值:無(wú)(函數(shù)會(huì)直接修改輸入范圍的內(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)建隨機(jī)數(shù)生成器
std::random_device rd; // 隨機(jī)設(shè)備(硬件熵源)
std::mt19937 g(rd()); // 梅森旋轉(zhuǎn)算法(常用的隨機(jī)數(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)建隨機(jī)數(shù)生成器
std::random_device rd;:用于生成種子。std::mt19937 g(rd());:使用梅森旋轉(zhuǎn)算法(Mersenne Twister)作為偽隨機(jī)數(shù)引擎。
調(diào)用
std::shuffle進(jìn)行洗牌std::shuffle(vec.begin(), vec.end(), g);重新打亂vec中的元素順序。
打印打亂后的數(shù)組
- 遍歷并輸出
vec。
- 遍歷并輸出
4. 示例輸出
Shuffled vector: 3 7 5 9 1 4 2 8 6
(輸出的順序是隨機(jī)的,每次運(yùn)行結(jié)果可能不同。)
5. 重要說(shuō)明
為什么不用 std::random_shuffle?
std::random_shuffle需要內(nèi)部調(diào)用rand(),它的隨機(jī)性較弱,而且rand()不是線程安全的。std::shuffle允許使用高質(zhì)量的隨機(jī)數(shù)生成器(如std::mt19937)。
std::mt19937 vs std::default_random_engine
std::default_random_engine可能因不同的編譯器實(shí)現(xiàn)不同,因此推薦使用std::mt19937。
如何使用固定種子進(jìn)行可復(fù)現(xiàn)的隨機(jī)洗牌?
std::mt19937 g(42); // 42 作為固定的隨機(jī)種子 std::shuffle(vec.begin(), vec.end(), g);
這樣每次運(yùn)行代碼都會(huì)得到相同的打亂結(jié)果。
6. 適用場(chǎng)景
- 隨機(jī)排序數(shù)據(jù)
- 生成隨機(jī)測(cè)試用例
- 洗牌(如撲克牌游戲)
- 打亂數(shù)據(jù)以避免排序偏差(如機(jī)器學(xué)習(xí)數(shù)據(jù)預(yù)處理)
7. 結(jié)論
std::shuffle 是現(xiàn)代 C++ 中推薦的隨機(jī)洗牌方法,結(jié)合 std::mt19937 可以提供高質(zhì)量的隨機(jī)性,適用于各種隨機(jī)排列的場(chǎng)景。
?? 推薦使用 std::shuffle 代替 std::random_shuffle,并搭配 std::mt19937 以獲得更好的隨機(jī)性和可控性!
到此這篇關(guān)于C++中std::shuffle的使用小結(jié)的文章就介紹到這了,更多相關(guān)C++ std::shuffle內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++的static關(guān)鍵字及變量存儲(chǔ)位置總結(jié)
今天看博文時(shí),看到了c++的static關(guān)鍵字的一些總結(jié),還涉及到了一些代碼的存儲(chǔ)位置;接下來(lái)為您詳細(xì)呈現(xiàn)2012-11-11
實(shí)例講解C++設(shè)計(jì)模式編程中State狀態(tài)模式的運(yùn)用場(chǎng)景
這篇文章主要介紹了實(shí)例講解C++設(shè)計(jì)模式編程中State狀態(tài)模式的運(yùn)用場(chǎng)景,文章最后的適用性部分則介紹了一些State模式善于處理的情況,需要的朋友可以參考下2016-03-03
深度解析C語(yǔ)言中數(shù)據(jù)的存儲(chǔ)
本文詳細(xì)介紹了C語(yǔ)言中數(shù)據(jù)的存儲(chǔ),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05

