我正在寻找一种通用的、可重用的方法来在 C++ 中对 std::vector
进行洗牌。这就是我目前的做法,但我认为它不是很有效,因为它需要一个中间数组并且它需要知道项目类型(本例中为 DeckCard):
srand(time(NULL));
cards_.clear();
while (temp.size() > 0) {
int idx = rand() % temp.size();
DeckCard* card = temp[idx];
cards_.push_back(card);
temp.erase(temp.begin() + idx);
}
最佳答案
从 C++11 开始,您应该更喜欢:
#include <algorithm>
#include <random>
auto rng = std::default_random_engine {};
std::shuffle(std::begin(cards_), std::end(cards_), rng);
确保在多次调用 std::shuffle
时重复使用相同的 rng
实例如果您打算每次都生成不同的排列!
此外,如果您希望您的程序在每次运行时创建不同的随机播放序列,您可以使用 std::random_device
的输出为随机引擎的构造函数播种。 :
auto rd = std::random_device {};
auto rng = std::default_random_engine { rd() };
std::shuffle(std::begin(cards_), std::end(cards_), rng);
对于 C++98,您可以使用:
#include <algorithm>
std::random_shuffle(cards_.begin(), cards_.end());
关于c++ - 如何洗牌 std::vector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6926433/