在 C++ 中隨機化向量
Jinku Hu
2023年10月12日
本文將演示關於如何在 C++ 中對向量元素進行隨機化的多種方法。
使用 shuffle
演算法來洗牌向量元素
std::shuffle
是 C++ <algorithm>
庫的一部分,實現了隨機排列功能,可以應用於給定範圍內的元素。該函式將範圍迭代器作為前兩個引數,隨機數發生器作為第三個引數。隨機數生成器是一個函式物件。當代 C++ 推薦使用隨機數生成器的標準庫實用程式。應該使用 std::random_device
來產生不確定的數字。
最後,必須建立所選的隨機數引擎物件,並將其傳遞給 shuffle
演算法,以生成範圍內的隨機排列。請注意,我們在隨機化完成之前和之後列印一個整數向量。
#include <algorithm>
#include <iostream>
#include <random>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::shuffle;
using std::string;
using std::vector;
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::begin
和 std::end
物件實現相同的子程式,將範圍迭代器傳遞給 shuffle
函式。下面的例子可以是一個更通用的版本,用於特定的編碼方案。
#include <algorithm>
#include <iostream>
#include <random>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::shuffle;
using std::string;
using std::vector;
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 <algorithm>
#include <iostream>
#include <random>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::shuffle;
using std::string;
using std::vector;
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;
作者: Jinku Hu