0

嗨,我正在研究在二维数组中生成没有重复行的随机数的问题。

我以这种方式接近我使用随机洗牌来做到这一点,代码是

    #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

有没有更好的方法来消除重复行并在二维数组中生成唯一行。谢谢大家的帮助

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

这个答案就像 P0W 的一样,除了使用std::vector而不是数组,然后所有排列都被打乱以随机化它们的顺序。

    #include <algorithm>
    #include <iostream>
    #include <vector>
    #include <iterator>
    #include <ctime>
    #include <cstdlib>

    int main ()
    {
        std::srand(std::time(NULL));
        std::vector<std::vector<int> > rows;
        unsigned min_value = 1;
        unsigned max_value = 4;
        rows.push_back(std::vector<int>(max_value - min_value + 1));
        for(unsigned i = min_value; i <= max_value; i++)
            rows[0][i - min_value] = i;
        while(std::next_permutation(rows.rbegin()->begin(),
                                    rows.rbegin()->end()))
            rows.push_back(*rows.rbegin());
        rows.push_back(*rows.rbegin());
        std::random_shuffle(rows.begin(), rows.end());

        for(unsigned i = 0; i < rows.size(); i++)
        {
            std::copy(rows[i].begin(), rows[i].end(),
                      std::ostream_iterator<int>(std::cout, " "));
            std::cout << '\n';
        }
    }
于 2013-10-03T17:42:25.343 回答
0

跟踪您创建的行。创建新行时,请检查您是否尚未创建该行。如果有,请废弃它并再次创建新行。

于 2013-10-03T17:07:22.100 回答