0

こんにちは、2次元配列に重複行がない乱数を生成する問題に取り組んでいます。

私はこの方法でアプローチし、ランダムシャッフルを使用してそれを行い、コードは

    #include <stdlib.h>
    #include <time.h>
    #include<iostream>

    using namespace std;

    int main ( void )
    {
        srand ( time(NULL) );
        int nsize = 4;
        int seq[nsize];
        int i;

        /* Initialize seq to an ordered range */
        for ( i = 0; i <nsize; i++ )
        {
            seq[i] = i+1;
        }
        cout<<"ele in initial array:";
        for(int j=0;j<nsize;j++)
            cout<<seq[j]<<" ";
        cout<<endl;
        int **array = new int *[nsize * 5];
        for(int i=0;i<nsize*5;i++)
            array[i] = new int[nsize];

        /* Random shuffle */
        int k;

        for(k=0;k<20;k++)
        {
            //srand ( time(NULL) );
            for ( i = nsize-1; i >0; i-- ) {
                //srand ( time(NULL) );
                int r = ( rand() % (nsize - 1 ));
                //srand ( time(NULL) );
                int save = seq[i];
                seq[i] = seq[r];
                seq[r] = save;
            }

            for ( i = 0; i < nsize; i++ )
            {
                array[k][i] = seq[i];
            }


            for(int i=0;i<20;i++)
            {
                for(int j=0;j<nsize;j++)
                {
                    cout<<array[i][j]<<" ";
                }
                cout<<endl;
            } 
            return 0;
        }
    }

しかし問題は、同じ行を生成していることです。

    2 4 3 1
    1 4 3 2 
    1 3 2 4 
    2 4 3 1 
    2 1 4 3

重複行を排除し、2次元配列で一意の行を生成するためのより良い方法はありますか? ご協力ありがとうございました

4

3 に答える 3

1

24行で1〜4のすべての可能な順列が必要なようです。一時的な行列を使用して前の行を追跡する方法が必要です

簡単な方法は次のとおりです。

size_t k=0;
std::sort(arr, arr+nsize);
do {
    for(int i=0;i<nsize;i++)
     array[k][i] = arr[i];
     k++;
} while(std::next_permutation(arr, arr+nsize));

こちらをご覧ください

于 2013-10-03T17:23:50.107 に答える
0

作成した行を追跡します。新しい行を作成するときは、その行をまだ作成していないことを確認してください。持っている場合は、破棄して新しい行を再度作成します。

于 2013-10-03T17:07:22.100 に答える