0

ベクトルをランダムな整数で埋めたいのですが、重複はできません。

まず、 numberOfSlotsのランダムな整数を 0 から 7 の範囲でベクトルに入れるコードがあります ( numberOfSlotsは 2 から 20 まで可能です)。

srand((unsigned int)time(NULL));
unsigned int min = 0;
unsigned int max = 7;
std::vector<unsigned int> v;

for (int i = 0; i < numberOfSlots; i++) {
  unsigned int rdm = std::rand() % (max - min + 1) + min;
  v.push_back(rdm);
}

これは、整数の重複が許可される場合のコードです。これはうまくいっています!

ここで、そのコードを変更して、可能な整数 ( minからmaxまで) の同じランダム プールから、生成されたランダム整数がベクトルにない場合にのみ追加されるようにします。

したがって、たとえばnumberOfSlotsが 5 の場合、ベクトルにはプールからランダムに選択された 5 つのエントリがありますが、同じではありません (例: 7、1、3、5、0) 。numberOfSlotsが 8 の場合、ベクトルはたとえば次のようになります。 3、1、2、7、6、0、4、5。

ベクトルなどをシャッフルする方法は知っていますが、これを機能させることができません。while ループを使用して、ベクトル内の既存のすべての整数を、追加する新しい乱数に対してチェックし、既にそこにある場合は、新しい乱数を生成して再度チェックする必要があると思いますが、わかりません

私は初心者で、これは本当に難しいです。誰かが私にヒントを与えることができますか?よろしくお願いします...どうもありがとう

4

2 に答える 2

2

最善の策は、ランダム化されていない整数を格納するベクトルを作成してから、ランダム化されたサブセットを格納する別のベクトルを作成することだと思います。

ランダム化されていない整数ベクトルからランダムに数値を選択し、その数値をランダム化されたサブセット ベクトルに追加してから、ランダム化されていない整数ベクトルから削除します。

これで、ランダム化されていない整数ベクトルが 1 つ小さくなったので、新しい小さいベクトルの数値をランダムに選択し、それをランダム化されたサブセット ベクトルに追加して、ランダム化されていないベクトルから削除します。繰り返す。

これがどのように見えるかです


無作為化されていない

{0, 1, 2, 3, 4, 5, 6, 7}

ランダム化

{}

ランダムなインデックスを選択: 5

収量 =>


無作為化されていない

{0, 1, 2, 3, 5, 6, 7} //Removed 4 because it was at index #5

ランダム化

{5}

ランダム インデックスを選択: 0

収量 =>


無作為化されていない

{1, 2, 3, 5, 6, 7}

ランダム化

{5, 0}

ランダム インデックスの選択: 6

収量=>


ランダム化されていない

{1, 2, 3, 5, 6} // 7 removed at index #6

ランダム化

{5, 0, 7}

そして、ここで 3 つのランダムな値を選択するだけで、最終的に 5、0、7 になるとします。この方法により、重複がなくなります。インライン関数を使用するより簡単な方法があると思いますが、わかりません。上記で十分です。

于 2013-11-05T04:52:09.267 に答える