用矩阵c ++中的bool函数检查重复数字

时间:2017-12-04 11:29:19

标签: c++ matrix

我用随机数创建了一个矩阵[10] [10]

for (int i = 0; i < 10; i++)
{
    for (int j = 0; j < 10; j++)
    {
        matrix[i][j] = rand() % 100 ;

    }   
}

但我需要使用bool函数来检查重复数字,如果它同样再次使用随机数。我该怎么办?

2 个答案:

答案 0 :(得分:1)

测试重复项的有效方法是将已插入矩阵的元素存储在std::vector中并用于std::find。这允许检查新生成的随机数是否已经包括在先前存储的元素中。如果找到,则应生成另一个随机数并重复测试。

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

bool alreadySelected(int n, int nvalues, int values[][10]) {
  std::vector<int> v(&values[0][0], &values[0][0] + nvalues );
  return (std::find(v.begin(), v.end(), n) != v.end());
}

int main() {
  int matrix[10][10];      
  for (int i = 0; i < 10; i++) {
    int n;
    bool dupe;
    for (int j = 0; j < 10; j++) {
    int nvalues = i * 10 + j;
    do {
      n = std::rand() % 100 ;
      dupe = alreadySelected( n, nvalues, matrix );
    } while ( dupe );
    matrix[i][j] = n;
    std::cout << matrix[i][j] << " ";
   }
   std::cout << "\n";
  }
}

生成这种矩阵的一种更简单的方法是使用std::random_shuffle

答案 1 :(得分:-1)

有多种方法可以实现这一目标。

  1. 编写一个返回bool并取10 * 10矩阵大小的函数。计算所有数字的总和。将此结果与1 ... 99之间的数字之和进行比较。如果两个匹配则没有重复返回true,否则重复返回false。可以使用n(n + 1)/ 2计算1..99的和,其中n = 99。
  2. 在函数中创建大小为100的数组。用0初始化所有数组元素。迭代矩阵,使用矩阵元素作为数组的索引。如果数组在该位置包含1,则您将获得重复元素,否则在该索引处生成数组元素。
  3. 第一种方法的实施

    #include <iostream>
    #include <cstdlib>
    #include <iomanip>
    
    #define ROW 10
    #define COL 10
    #define MOD 100
    
    int main()
    {
     int mat[ROW][COL];
     int sum = 0;
     int range_sum = ((MOD-1)*(MOD))/2; // n = MOD-1, sum = n(n+1)/2
     while(true){
        sum = 0;
        for(int i = 0; i < ROW; i++){
            for(int j = 0; j < COL; j++){
                mat[i][j] = rand()%MOD;
                sum += mat[i][j];
            }
        }
        if(sum==range_sum){
            break;
        }
    
     }
    
     for(int i = 0; i < ROW; i++){
        for(int j = 0; j < COL; j++){
            std::cout << std::setw(2) << mat[i][j] << "  ";
            }
            std::cout << std::endl;
        }
    
     return 0;
    }