1

100個の要素の配列を作成し、rand()関数を使用してランダムな値を割り当て、配列内に重複があるかどうかを確認する割り当てが与えられました。コードを完了して正常に実行しましたが、実際に重複をチェックしているのか、重複を印刷しているだけなのかはわかりません。何度も実行したのですが、「重複値が見つかりました」と表示されていません。

#include <iostream>
using namespace std;
void main ()
{
    int array1[100];
    for (int a=0; a<100; a++)
    {
        array1[a]=rand();
        cout<<array1[a]<<endl;
    }
    for(int b=0;b<100;b++)
    {
        for(int c=b+1;c<100;c++)
        {
            if(array1[b]==array1[c])
            {
                cout<<"Array contains duplicates\n";
                break;
            }
        }
    }
    cout<<"No Duplicates found"<<endl;
}
4

6 に答える 6

1

アルゴリズムを確認するのではなく (適切に理解できる場合とそうでない場合があります)、テスト コードを作成することをお勧めします。rand() のように機能する fake_rand() 関数を作成してください。その偽の関数を非常に理解しやすくするか、テスト コードも作成する必要があります。

次に、実際のアルゴリズムの代わりにそれを使用して、アルゴリズムをテストします。

テスト コードは非常に便利で強力な概念です。Google で検索するには時間がかかります。

于 2012-12-02T21:46:55.060 に答える
1

rand()は値を返すため、その[0, RAND_MAX)うちの 2 つが 100 個の値で等しくなる可能性はほとんどありません (RAND_MAX少なくとも 32k であることが保証されていますが、おそらくそれよりもはるかに大きいでしょう)。

modulo operator: rand()%MAX_VALUEyield a value inを使用して、生成できる数値の範囲を狭めるようにしてください[0, MAX_VALUE)

実際には、ピジョンホールの原則を解釈することにより、選択MAX_VALUE < 100した場合は確実に複製する必要があります。

于 2012-12-02T21:44:29.397 に答える
1

ここで関数と関数テストが役に立ちます。重複チェック コードを独自の関数に移動します。次に、重複が含まれていることがわかっている値で初期化された配列を作成し、それを新しいチェック関数に渡し、期待どおりの結果が得られるかどうかを確認します。

于 2012-12-02T21:44:31.943 に答える
0

うーん。rand は、異なる開始値でシードされていない場合、常に同じシーケンスを返します。そのため、srand を異なるシード (おそらく現在の時間から派生したもの) で呼び出す必要があります。そうしないと、最初の実行ですべてが異なる場合、それらはすべて永遠に異なります。

于 2012-12-02T21:52:57.210 に答える
0

コードは機能的に正しいようです。100 個の乱数のセット (2^32 の合計数空間から) で重複を見つける確率はかなり低いことに注意してください。

于 2012-12-02T21:51:01.593 に答える