Vectorをシャッフルする(C++11)
はるそうパパです。思い出したかのようにプログラミングTIPSを投稿します。
今cocos2d-xで九九計算アプリを開発中なのですが、問題データをVectorに詰めてシャッフルしたくなりました。
現在使用しているバージョンは3系なので、C++11で推奨されてる方法で実装すべきですね。
ネット上で色々調べた結果、下記の方法で実現できました。
#include <algorithm> #include <random>
Vector<std::string> questionList = Vector<std::string>(81); //九九を生成してVectorに詰める for (int row = 1; row < 10; row++) { for (int col = 1; col < 10; col++) { questionList.pushBack(StringUtils::format("%d × %d",row,col)); } } std::random_device rdev{}; //乱数生成器を生成 std::mt19937 mt(rdev()); //メルセンヌ・ツイスタ生成器を使用 std::shuffle(std::begin(questionList), std::end(questionList), mt);//Vectorをシャッフル!
前半は本件とは関係なく、Vectorに九九を詰めてます。このままだと九九の「1 × 1」から「9 × 9」まで順番に表示されてしまいおもしろくないので、後半でシャッフルしています。
ぜひお試しください。
参考:
メルセンヌ・ツイスタ - Wikipedia
shuffle - cpprefjp C++日本語リファレンス
c++ - How to shuffle a std::vector? - Stack Overflow