c++ - 如何洗牌 std::vector?

标签 c++ shuffle stdvector

我正在寻找一种通用的、可重用的方法来在 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);

Live example on Coliru

确保在多次调用 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/

相关文章:

C++ 使用带有 count() 函数的列表

c++ - 关于在 CentOS-6.5 上安装 gcc-6.* 的问题

c++ - 在不使用乘法和除法运算符的情况下如何计算A到幂B?

python - Numpy:洗牌元素的子集

c++ - 一种用于对等值条目进行排序和改组的快速算法(最好使用 STL)

c++ - push_back() 和 resize(size()+1) 有区别吗

c++ - 使用 std::vector 进行 Eigen::MatrixXd.block 赋值

compare - 如何确定 `ranges::view` 对象和 `std::vector` 之间的等价性?

c++ - 访问无限数组元素?

php - 同样的方法,根据数字对数组进行洗牌