1. ホーム
  2. c++

[解決済み] std::vectorをシャッフルするには?

2022-03-08 21:48:52

質問

をシャッフルする汎用的で再利用可能な方法を探しています。 std::vector をC++で作成しました。これは現在私が行っている方法ですが、中間配列が必要で、アイテムのタイプ(この例では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);

Coliruでのライブ例

のインスタンスは必ず再利用してください。 rng を複数回呼び出すことで std::shuffle 毎回異なる並べ替えを生成するのであれば、この方法がおすすめです。

さらに、プログラムを実行するたびに異なるシャッフルのシーケンスを作成したい場合は、ランダムエンジンのコンストラクタに、以下の出力をシードすることができます。 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());