javascript magazine

主にjavascriptについて書こうと思っています。

c++ std::vectorでランダムに並べる

c++のstdは、イテレータ型の変数をランダムに並べる関数があります。 これを使うと、std::vectorなどの要素に対してもランダムに並べることができます。

using namespace std;
vector<int>vec;
vec.push(1);
vec.push(2);
random_shuffle(vec.begin(), vec.end());

これで、いいはずですが、繰り返してみると同じ結果が返って来ます
cでそうだったように

srand(unsigned(time(NULL)));

的なものを利用するしないといけないんじゃないかと思ったら、
第3引数に_RandomNumberGeneratorを入れる必要があるみたいです。
これを入れてみると

auto rng = std::default_random_engine {};
random_shuffle(numbers.begin(), numbers.end(),rng);

しかし、今度は以下のエラーが出てコンパイルが通らない
No matching function for call to object of type 'std::__1::linear_congruential_engine<unsigned int, 48271, 0, 2147483647>
cocos2dxだからだろうか

{
    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
    difference_type __d = __last - __first;
    if (__d > 1)
    {
        for (--__last; __first < __last; ++__first, --__d)
        {
            // ここ
            difference_type __i = __rand(__d);
            swap(*__first, *(__first + __i));
        }
    }
}    

これを解決する元気が出なかったので、手製のrandom関数を引用して適用しました。

auto seed = std::chrono::system_clock::now().time_since_epoch().count();
shuffle(numbers.begin(), numbers.end(),default_random_engine(seed));