在 C++ 中隨機化向量

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

本文將演示關於如何在 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::beginstd::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
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ Vector