[解決済み] 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);
のインスタンスは必ず再利用してください。
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());
関連
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] JavaScriptの配列をランダム化(シャッフル)する方法は?
-
[解決済み] std::vector にある項目が存在するかどうかを調べるには?
-
[解決済み] DataFrameの行をシャッフルする
-
[解決済み] std::vector<> からインデックスで要素を消すにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】Enterキーを押して続行する
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み】'std::cout'への未定義の参照