wide and shallow life.

四十路アプリ開発者の備忘録

Vectorをシャッフルする(C++11)

f:id:yokada3:20160206131728j:plain
はるそうパパです。思い出したかのようにプログラミング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