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));