1

ピッキング自体は簡単ですが、同じ場所にポイントを配置できないようにするのに苦労しています。もちろん再ランダム化することもできますが、もっと良い方法はありますか?どうもありがとう!

4

3 に答える 3

2

これを行うには、2Dインデックスx、yを1Di線形化します。

MxNサイズの2D配列があると仮定します。

[0、MxN)でランダムな整数を生成します:

int i1 = rand() % (M * N);

2D配列インデックスは次のようになります。

int x1 = i1 % M;
int y1 = i1 / M;

次に、2D配列をカバーするが、前にヒットしたものはカバーしない2番目の1Dインデックスを生成します。これを行うには、 [0、MxN-1)で乱数を生成し、この1Dインデックスを最初に生成された数で循環させます。

int i2 = (rand() % (M * N - 1) + i1 + 1) % (M * N);

もちろん、 MxN1x1でない場合、これら2つの1Dインデックスは常に異なります。

2Dインデックスの2番目のペアも同様です。

int x2 = i2 % M;
int y2 = i2 / M;
于 2012-05-05T00:20:59.683 に答える
2

N個の可能な場所からK個のインデックスをランダムに選択することは、最初に配列をランダムにシャッフルしてから、最初のK個のインデックスを取得することと同じです。C ++(タグとして指定しているもの)でプログラムする場合は、次のように簡単に実行できます。

まず、2D配列をフラットにします。たとえば、ベクトルに格納されているとします。

#include <vector>
#include <algorithm>
using namespace std;

.... initialize elems to whatever you want, here all zeros ......

vector<int> elems (N*M, 0);

// assigning your indices from 0 to elems.size()-1
vector<int> index (elems.size());
for (int i=0; i<index.size(); i++)
{
    index[i] = i;
}

// now random permute
random_shuffle (index.begin(), index.end());

// now assign the elements to whatever you want, here assign them to 1
elems[index[0]] = 1;
elems[index[1]] = 1;
于 2012-05-05T00:34:59.190 に答える
1

junjanesにはほとんど解決策がありますが、実際には同じインデックスを2回生成することを妨げるものではありません。

代わりに、次の方法でi2を生成します。

int i2 = rand() % (M * N - 1);
if (i2 >= i1) ++i2;
于 2012-05-05T00:24:40.600 に答える