2次元のマップに複数のキャラクターをランダムに配置しようと思い、xとyをランダムで求めようとしたが、これだとすでに配置した位置が出てしまうことがある。
そこで、2次元の配列を1次元の配列で表し、配列に先頭からキャラクターを詰めて代入。その配列をシャッフルし、再び2次元の配列に戻してやれば、ランダムに配置することが出来る。
実際にvectorとアルゴリズムのshuffleを利用して試してみたのが次のコード。
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main(void){ int w=4; // マップ幅 int h=4; // マップ高さ int num=8; // 配置するもの個数 // vectorに並べる std::vector<int> vec; for(int i=0; i<w*h; ++i) { if(i < num) { vec.push_back(1); } else { vec.push_back(0); } } // シャッフルする std::random_device seed_gen; std::mt19937 engine(seed_gen()); std::shuffle(vec.begin(),vec.end(),engine); // 配列にコピー int map[w][h]; for(int y=0; y<h; ++y) { for(int x=0; x<w; ++x) { map[x][y] = vec[y*w+x]; cout << map[x][y] << ' '; } cout << '\n'; } cout << '\n'; } 出力例: 0 0 0 1 1 0 1 1 1 1 0 1 0 0 1 0