在 C++ 中隨機化向量

Jinku Hu 2023年1月30日 2020年12月31日
  1. 使用 shuffle 演算法來洗牌向量元素
  2. 使用 random_shuffle 演算法對向量元素進行隨機化
在 C++ 中隨機化向量

本文將演示關於如何在 C++ 中對向量元素進行隨機化的多種方法。

使用 shuffle 演算法來洗牌向量元素

std::shuffle 是 C++ <algorithm> 庫的一部分,實現了隨機排列功能,可以應用於給定範圍內的元素。該函式將範圍迭代器作為前兩個引數,隨機數發生器作為第三個引數。隨機數生成器是一個函式物件。當代 C++ 推薦使用隨機數生成器的標準庫實用程式。應該使用 std::random_device 來產生不確定的數字。

最後,必須建立所選的隨機數引擎物件,並將其傳遞給 shuffle 演算法,以生成範圍內的隨機排列。請注意,我們在隨機化完成之前和之後列印一個整數向量。

#include <iostream>
#include <vector>
#include <random>
#include <algorithm>

using std::cout; using std::cin;
using std::endl; using std::string;
using std::vector; using std::shuffle;

template<typename T>
void printVectorElements(vector<T> &vec)
{
    for (auto i = 0; i < vec.size(); ++i) {
        cout << vec.at(i) << "; ";
    }
    cout << endl;
}

int main() {
    vector<int> i_vec1 = {12, 32, 43, 53, 23, 65, 84};

    cout << "i_vec1           : ";
    printVectorElements(i_vec1);

    std::random_device rd;
    std::default_random_engine rng(rd());
    shuffle(i_vec1.begin(), i_vec1.end(), rng);

    cout << "i_vec1 (shuffled): ";
    printVectorElements(i_vec1);
    cout << endl;

    return EXIT_SUCCESS;
}

輸出:

i_vec1           : 12; 32; 43; 53; 23; 65; 84;
i_vec1 (shuffled): 53; 32; 84; 23; 12; 43; 65;

作為前一種方法的替代,我們可以使用 std::beginstd::end 物件實現相同的子程式,將範圍迭代器傳遞給 shuffle 函式。下面的例子可以是一個更通用的版本,用於特定的編碼方案。

#include <iostream>
#include <vector>
#include <random>
#include <algorithm>

using std::cout; using std::cin;
using std::endl; using std::string;
using std::vector; using std::shuffle;

template<typename T>
void printVectorElements(vector<T> &vec)
{
    for (auto i = 0; i < vec.size(); ++i) {
        cout << vec.at(i) << "; ";
    }
    cout << endl;
}

int main() {
    vector<int> i_vec1 = {12, 32, 43, 53, 23, 65, 84};

    cout << "i_vec1           : ";
    printVectorElements(i_vec1);

    std::random_device rd;
    std::default_random_engine rng(rd());
    shuffle(std::begin(i_vec1), std::end(i_vec1), rng);

    cout << "i_vec1 (shuffled): ";
    printVectorElements(i_vec1);
    cout << endl;

    return EXIT_SUCCESS;
}

輸出:

i_vec1           : 12; 32; 43; 53; 23; 65; 84;
i_vec1 (shuffled): 43; 23; 32; 65; 53; 12; 84;

使用 random_shuffle 演算法對向量元素進行隨機化

std::random_shuffle 是 C++ 標準庫中的另一個實用演算法。舊版本的 std::shuffle 已經被最新的 C++ 標準捨棄了。雖然它仍可以在舊版 C++ 的編碼環境中使用。

random_shuffle 可以採取使用者提供的隨機數生成器,但由於舊版本的 C++ 缺乏隨機庫設施,人們可能只向函式提供範圍迭代器。在後一種情況下,random_shuffle 利用實現中定義的隨機數生成器,有時正好是 std::rand 函式呼叫。

#include <iostream>
#include <vector>
#include <random>
#include <algorithm>

using std::cout; using std::cin;
using std::endl; using std::string;
using std::vector; using std::shuffle;

template<typename T>
void printVectorElements(vector<T> &vec)
{
    for (auto i = 0; i < vec.size(); ++i) {
        cout << vec.at(i) << "; ";
    }
    cout << endl;
}

int main() {
    vector<int> i_vec1 = {12, 32, 43, 53, 23, 65, 84};

    cout << "i_vec1           : ";
    printVectorElements(i_vec1);

    std::random_shuffle(i_vec1.begin(), i_vec1.end());

    cout << "i_vec1 (shuffled): ";
    printVectorElements(i_vec1);
    cout << endl;

    return EXIT_SUCCESS;
}

輸出:

i_vec1           : 12; 32; 43; 53; 23; 65; 84;
i_vec1 (shuffled): 23; 53; 32; 84; 12; 65; 43;
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ Vector