0

長さ (size1) のランダムな配列を構築しようとしています。これを行うために私が調査した方法は、2 つの別個の配列を用意することです。1 つは乱数用で、もう 1 つは数値が繰り返されないようにするための「チェック」配列です。これらは、私のコードではそれぞれ (shuffle) と (visit) とラベル付けされています。count1 は、for ループをカウントするための整数です。

以下をさまざまな組み合わせで含めましたが、機能しませんでした。

    #include <ctime>
    #include <time.h>
    #include <cstdlib>

私が苦労しているように見えるコードはこれです:

    srand((unsigned)time(0));

for (count1 = 0; count1 < size1; count1++)
{
    num = (rand()%size1);
        if (visit[num] == 0)
        {
            visit[num] = 1;
            shuffle[count1] = num;
        }
}
4

3 に答える 3

3

srand の使用に問題はありません。ただし、説明するタスクは非常に単純で、関数の使用は含まれませんrand

std::vector<int> v(size);
std::iota(v.begin(), v.end(), 0);
std::random_shuffle(v.begin(), v.end());

関数がない場合はiota、増分する整数のシーケンスを生成するだけです。

于 2011-11-28T19:37:25.993 に答える
2

配列に 0 から size1-1 までの数値を入力し、それらの数値をシャッフルする方が簡単です。

したがって、cのようなコードで(長い間cを使用していません):

for (int count = 0; count < size1; count++) {
    shuffle[count] = count;
}

そしてそれをシャッフルします

for (int index = 0; index < size1; index++) {
    int shuffleIndex = index + rand() % (size1 - index);
    int temp = shuffle[shuffleIndex];
    shuffle[shuffleIndex] = shuffle[index];
    shuffle[index] = temp;
}

基本的に、配列の最初の要素に対して、任意のインデックスを選択して値を切り替えます。これで、最初のインデックスがランダムに選択されます。2 番目の要素については、ランダム インデックスを選択し (既にランダムに選択されているため、最初のインデックスを除く)、同じことを行います。最後の要素に到達するまで繰り返します。

于 2011-11-28T19:41:40.450 に答える
1

あなた#includeの問題ではありません。問題は、最初に生成した番号が既に使用されている場合に、別の番号を生成しようとしていないことです。

whilefor ループ内にループを含める必要があります。このループは、機能する数値が見つかるまで新しい数値を生成し続けます。

= 5のシーケンス4,1,4,2,4を生成すると、配列は次のようになります。size1

{4,1,0,2,0}

各エントリが0最初に設定されていると仮定します。これは、2 つ4の余分な が生成されたインデックスをスキップするだけだからです。

于 2011-11-28T19:35:25.043 に答える