我正在尝试生成一个填充了随机数的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循环并比较数组中的所有元素。但我不知道怎么用矩阵这样做。我到处搜索但似乎无法找到解决方案。
答案 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 =&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]<<",";
}
}
更新固定内存越界问题。
答案 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