如何检查一个矩阵中重复的数字
how to check a matrix for duplicate numbers 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循环来比较数组中的所有元素。但我不知道怎么用矩阵来做。我到处都找过了,但似乎找不到解决办法。
不太适合你的题目,但我认为你应该看一看。
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
更新修复内存越界问题。
相关文章:
- 检查输入是否不是整数或数字
- 如何检查一个c++字符串中有多少相同的字符/数字
- 用于检查数字是否有数字或可被该数字的值整除的程序
- 如何将 UTF-8 文本从文件转换为某个可以迭代的容器,并检查每个符号是否为C++字母数字?
- 如何使用递归检查数字是否有重复数字?
- C++ 检查结果数组中有多少次数字
- 将 C 函数转换为 C++ 以检查数字是否有效
- C ++:检查它是否是类中的数字
- 检查数字是否为素数的算法
- 如何检查用户的输入是否有效以及我正在寻找的数字?
- 找到 x^n 的所有组合,并检查它们的总和是否等于一个不包括相同数字的数字
- 如何在 c++ 中检查连续片段中数字被 11 整除
- 有没有办法检查用户输入是否是数字?
- 如何检查二维数组上的周围数字?
- 如何检查数字的不合理性
- 如何检查cin是否与数组中的一组数字匹配
- 非数字输入检查
- Cin读取数字并检查整数
- 如何用C++编写一个程序,该程序从输入中接收10个数字并检查这些数字是否按升序排列
- 给定一个数字,检查数字是否与加法组成一个方程