現在のC++(つまり、C ++ 11)ではshuffle
、疑似乱数ジェネレーター(PRNG)オブジェクト(シード可能)を3番目のパラメーターとして使用できるアルゴリズムを使用できます。
#include <iostream>
#include <random>
#include <algorithm>
#include <vector>
#include <string>
#include <ctime>
using namespace std;
int main(int argc, char **argv)
{
vector<string> v;
for (int i = 1; i<argc; ++i)
v.push_back(argv[i]);
mt19937 g(static_cast<uint32_t>(time(0)));
shuffle(v.begin(), v.end(), g);
for (auto &x : v)
cout << x << ' ';
cout << '\n';
}
(GCC 4.8.2の場合は、を介してコンパイルする必要がありますg++ -std=c++11 -Wall -g shuffle.cc -o shuffle
)
上記の例では、PRNGに現在のシステム時刻がシードされています。
C ++ 11より前のコンパイラの場合、STLにはアルゴリズムしかありませんが、random_shuffle
それでもオプションで数値ジェネレータオブジェクト/関数を指定できます。PRNGオブジェクトをそのように引き込むことはできないことに注意してくださいmtl19937
(メンバーを提供しないためoperator()(U upper_bound)
)。
したがって、次のように独自のアダプタを提供できます。
#include <iostream>
#include <random>
#include <algorithm>
#include <vector>
#include <string>
#include <ctime>
using namespace std;
struct Gen {
mt19937 g;
Gen()
: g(static_cast<uint32_t>(time(0)))
{
}
size_t operator()(size_t n)
{
std::uniform_int_distribution<size_t> d(0, n ? n-1 : 0);
return d(g);
}
};
int main(int argc, char **argv)
{
vector<string> v;
for (int i = 1; i<argc; ++i)
v.push_back(argv[i]);
random_shuffle(v.begin(), v.end(), Gen());
for (vector<string>::const_iterator i = v.begin(); i != v.end(); ++i)
cout << *i << ' ';
cout << '\n';
}