如何检查一个矩阵中重复的数字

how to check a matrix for duplicate numbers C++

本文关键字:数字 何检查 检查 一个      更新时间:2023-10-16

我试图生成一个充满随机数的5x20矩阵。如何确保随机数都不是重复的?这是我用随机数填充矩阵的代码。

srand(time(0));
int matrix[5][20];
int i = 0;
int j = 0;
for (i = 0; i < 5; i++)
{
    for (j = 0; j < 20; j++) 
    {
        matrix[i][j] = 1 + (rand() % 100);
        cout << matrix[i][j] <<"_";
    } 
    cout << endl;
} 

的代码工作,但有时有重复。如果这是一个数组,我可以使用一个简单的for循环来比较数组中的所有元素。但我不知道怎么用矩阵来做。我到处都找过了,但似乎找不到解决办法。

不太适合你的题目,但我认为你应该看一看。

   for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 20; j++) 
        {
        matrix[i][j] = 1 + (rand() % 100);
        cout << matrix[i][j] <<"_";
        } 
        cout << endl;
    }

我不知道5x20和100 (in rand() % 100)是强制性的还是只是一个你想给的例子。所以我建议在所有情况下我都可以考虑:

设矩阵元素的个数为a,集合的个数(包含所有可能生成的数)为b。在你的例子中,a为5x20=100, b为100(从1到100)。

  • a> b:自Dirichlet原理以来没有重复的有效矩阵
  • a == b:看看http://en.cppreference.com/w/cpp/algorithm/random_shuffle。只需创建一个一维数组,其中包含从0到b-1(或从您的范围的最小和最大)的连续数字,并对它们进行排列。然后用它来填充矩阵。
  • & lt;B:类似于情况a== B,但你只是取了一部分排列。

当然,当a =<然后你可以使用rand(),但你必须检查副本并重试rand(),这是相当复杂的。您可以创建一个标记数组(这需要内存)或再次遍历矩阵(这需要时间)。>

作为一个提示,除非你有明确的理由(比如教授的要求),否则你不应该使用rand()

下面的方法使用GetIndex函数用int[100]模拟int[5][20]。看看您是否能弄清楚如何使用我编写的代码来创建int[5][20]

你的代码用1到100 (1 + (rand() % 100))之间的随机数填充矩阵,但你没有做任何工作来确保你没有得到重复!因此,您将无法保证您没有得到重复(实际上,您没有得到重复是非常不寻常的)。

如果你首先初始化所有的值为1,…,100,然后再洗牌,你知道你没有重复的。

#include <iostream>
#include <iomanip>
#include <random>
#include <algorithm>
constexpr size_t kDefaultMatrixHeight = 20;
constexpr size_t kDefaultMatrixWidth = 5;
constexpr size_t GetIndex(size_t i, size_t j) {
  return i * kDefaultMatrixWidth + j;
}
int main() {
  int matrix[kDefaultMatrixWidth * kDefaultMatrixHeight];
  for (size_t i = 0 ; i < kDefaultMatrixHeight * kDefaultMatrixWidth ; i++) {
    matrix[i] = i + 1;
  }
  std::mt19937 rng(std::random_device{}());
  std::shuffle(std::begin(matrix), std::end(matrix), rng);
  for (size_t i = 0 ; i < kDefaultMatrixHeight ; i++) {
    for (size_t j = 0; j < kDefaultMatrixWidth ; j++) {
      std::cout << std::setw(4) << matrix[GetIndex(i,j)];
    }
    std::cout << 'n';
  }
}

例如输出:

Test@Test:/tmp/example$ g++ example.cpp && ./a.out
  93  28  70  14  39
  83   3  80  95  58
  42  69  71  16  49
  75  63  41  82  46
  26  50  81  33  97
  65  10  77  68  12
   8  19  30  86  37
  57  24  78  31  88
   2  90   4  13  56
  36  15  35  32  85
  29  76  99  45  18
  54  11  44  62  98
   9  96  79  34  27
  40  21  52  22  55
  72   1  47  92  59
  94   7  64  91  53
  74   5  61 100  89
  48  23  66  67  51
  38   6  87  17  20
  60  25  84  43  73

不完全回答你的问题,但为了你的目的,你可以尝试这样做:

#include <iostream>
#include <string>
#include <algorithm>
int main()
{
    srand(time(0));
    int matrix[5][20];
    int *pmatrix = &matrix[0][0];
    int i = 0;
    for (i = 0; i < 100; i++)
    {
        pmatrix[i] = i+1;
    } 
    
    std::random_shuffle(pmatrix, pmatrix+100);
    
    for (i = 0; i < 100; i++)
    {
        std::cout<<pmatrix[i]<<",";
    } 
    
}

cpp.sh/5 bnyt

更新修复内存越界问题。