2012-05-04 13 views
1

ピッキング自体は簡単ですが、私は同じ場所にポイントを配置することができないことを確認するのに問題があります。私は当然のことながら再ランダム化することができますが、より良い方法がありますか?どうもありがとう!2D配列に2つのユニークなポイントをランダムに配置する方法はありますか?

+0

これはどのような用途ですか?他のランダム座標を選択することが許容できない理由はありますか? –

+0

ランダムな可能性の1つは、同じポイントを連続して2回取得することです。 – kenny

+0

もう1つの可能性は、同じポイントを連続して1000回取得することです(したがって、リローリングは理想的ではありません)。 –

答えて

2

選択Kインデックス:

ではなく、このようI2を生成します。

最初に、2D配列をフラットにして、ベクトルに格納します。vector elems;

#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; 
2

あなたは1D にあなたの2D指数のx、yのを線形化することにより、これを行うことができます。

次元配列がMxNであるとします。

でランダム整数を生成する[0、M×N個)

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

あなたの2次元配列インデックスは次のようになります

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

今の2Dアレイを覆う第2の1Dのインデックスを生成するが、あなたが以前にヒットしたものではありません。当然の場合これら二つの1Dのインデックスは常に、異なるであろう

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

:あなたは乱数[0、M×N個-1を生成することにより、これを行うと、最初の発生数でこの1Dインデックスを循環することができMxN1x1ではありません。

2Dインデックスのあなたの第二の対も同様である。

int x2 = i2 % M; 
int y2 = i2/M; 
+1

アイデアは良いですが、 'i2'の実際の表現は間違っています。 –

+1

が良くなっていますが、それでもかなり正しくはありません;)ヒント:次の位置に移動します。 –

1

junjanesほとんど溶液を有しているが、実際には2回、同じインデックスを生成妨げません。ランダム最初シャッフリングランダムアレイに相当し、その後、最初のk個のインデックスを取るN可能な位置から

int i2 = rand() % (M * N - 1); 
if (i2 >= i1) ++i2; 
関連する問題