数组中固定数字范围的随机生成,在该2d数组中没有重复行

时间:2013-10-03 17:00:29

标签: c++ random

您好我正在研究在2d数组中生成没有重复行的随机数的问题。

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

    #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

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

3 个答案:

答案 0 :(得分: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));

请参阅HERE

答案 1 :(得分:0)

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

答案 2 :(得分: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';
        }
    }