亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++中std::shuffle的使用小結(jié)

 更新時(shí)間:2025年04月08日 09:37:17   作者:點(diǎn)云SLAM  
std::shuffle是C++標(biāo)準(zhǔn)庫(kù)中的一個(gè)函數(shù),用于對(duì)容器中的元素進(jìn)行隨機(jī)排列,本文主要介紹了C++中std::shuffle的使用小結(jié),具有一定的參考價(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++ 虛函數(shù)與純虛函數(shù)的區(qū)別(深入分析)

    c++ 虛函數(shù)與純虛函數(shù)的區(qū)別(深入分析)

    本篇文章是對(duì)c++中虛函數(shù)與純虛函數(shù)的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語(yǔ)言中如何通過(guò)指針參數(shù)返回值

    C語(yǔ)言中如何通過(guò)指針參數(shù)返回值

    這篇文章主要介紹了C語(yǔ)言中如何通過(guò)指針參數(shù)返回值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C語(yǔ)言掃雷游戲的簡(jiǎn)單實(shí)現(xiàn)

    C語(yǔ)言掃雷游戲的簡(jiǎn)單實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言掃雷游戲的簡(jiǎn)單實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C語(yǔ)言調(diào)用Python代碼的方法

    C語(yǔ)言調(diào)用Python代碼的方法

    這篇文章主要介紹了C語(yǔ)言調(diào)用Python代碼的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C++中淺拷貝與深拷貝的詳解及其作用介紹

    C++中淺拷貝與深拷貝的詳解及其作用介紹

    這篇文章主要介紹了C++中淺拷貝與深拷貝的詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • QT實(shí)現(xiàn)FTP上傳文件

    QT實(shí)現(xiàn)FTP上傳文件

    這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)FTP上傳文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 使用C++創(chuàng)建多個(gè)IPC機(jī)制的上層接口

    使用C++創(chuàng)建多個(gè)IPC機(jī)制的上層接口

    設(shè)計(jì)一個(gè)上層的IPC接口,這個(gè)接口將在未來(lái)封裝底層的通信機(jī)制,這樣的設(shè)計(jì)要求接口足夠抽象,以便于底層實(shí)現(xiàn)的細(xì)節(jié)對(duì)上層用戶透明,本文給大家介紹了如何使用C++創(chuàng)建多個(gè)IPC機(jī)制的上層接口,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的三子棋游戲

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的三子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C++11正則表達(dá)式詳解(regex_match、regex_search和regex_replace)

    C++11正則表達(dá)式詳解(regex_match、regex_search和regex_replace)

    正則表達(dá)式(regular expression)是計(jì)算機(jī)科學(xué)中的一個(gè)概念,又稱規(guī)則表達(dá)式,下面這篇文章主要介紹了C++11正則表達(dá)式(regex_match、regex_search和regex_replace)的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • C++用boost.signal實(shí)現(xiàn)多播委托

    C++用boost.signal實(shí)現(xiàn)多播委托

    這篇文章介紹了C++用boost.signal實(shí)現(xiàn)多播委托的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06

最新評(píng)論