如何检查矩阵的重复数字C ++

时间:2016-11-03 03:22:12

标签: c++

我正在尝试生成一个填充了随机数的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循环并比较数组中的所有元素。但我不知道怎么用矩阵这样做。我到处搜索但似乎无法找到解决方案。

3 个答案:

答案 0 :(得分:2)

它不太适合你的问题标题,但我认为你应该看看。

   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(在rand()%100中)是强制性的,或者只是你想给出的一个例子。所以我建议我可以考虑所有情况:

让p调用矩阵元素的数量是a,set的数量(包含所有可能生成的数量)是b。在你的例子中,a是5x20 = 100而b是100(从1到100)。

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

当然,当a =&lt; b然后你可以使用rand(),但你必须检查重复并重试rand(),这是非常复杂的。您可以创建标记数组(占用内存)或再次遍历矩阵(花费时间)。

答案 1 :(得分:0)

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

#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/5bnyt

更新固定内存越界问题。

答案 2 :(得分:0)

作为抬头,你不应该使用rand(),除非你有明确的理由(例如教授的要求)。

以下方法使用GetIndex函数来模拟int[5][20] int[100]。看看你是否可以弄清楚如何使用我写的代码来创建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