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

random generation of fixed range of numbers in array with no duplcate rows in that 2d array

本文关键字:数组 2D 在该 随机 范围 数字      更新时间:2023-10-16

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

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

    #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 数组中生成唯一的行。谢谢大家的帮助

看起来您需要 1-4 行中 24 的所有可能的排列,您需要一种方法来使用一些临时矩阵跟踪上一行

一个简单的方法是:-

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));

看这里

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

这个答案就像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';
        }
    }