はじめに
vectorの要素をシャッフルにはstd::shuffle
という標準ライブラリがあります。
基本的にはこちらを使いましょう。
ですが、自分でロジックを組んでみたかったので、
引数にいれたvector(ここではint型)の要素をシャッフルする関数をつくりました。
中身のデータがランダムに並べ替えられます。
シャッフルの処理ロジックってどんなのだろうってなった方のご参考になれれば幸いです。
関数
void shuffle(std::vector<int> *list)
{
for (std::vector<int>::reverse_iterator itr = (*list).rbegin(); itr != (*list).rend(); ++itr) // ①
{
int r = rand() % (*list).size(); // ②
int temp = (*itr); // ③
(*itr) = (*list).at(r); // ④
(*list).at(r) = temp; // ⑤
}
}
ざっくり説明
vectorの要素をほかの1要素と入れ替える、という処理をvectorの後ろのデータから順に行います。
- reverse_iteratorで並びかえるデータを後ろから順に走査します。①
- 要素の1つをランダムに選びます。②
- いまのforループで走査しているデータを一時保存します。③
- いまのforループで走査しているデータを、ランダムで選んだ要素のデータに上書きします。④
- ランダムで選んだ要素のデータを、いまのforループで走査しているデータに上書きします。⑤
※ランダムに選ぶところrand()を使っているので、あんまりランダムじゃないです。この点でもstd::shuffle
の方が良いです。
使用例
std::vector<int> data = {0, 1, 2, 3, 4};
shuffle(&data);