c++ - 使用函数洗牌矩阵(C++)
问题描述
我正在编写一个使用函数创建 10x10 矩阵的代码,它也使用函数进行打印。我目前正在制作一个函数,它将洗牌矩阵的内容并使用一个函数来洗牌矩阵并使用相同的函数来打印第一个矩阵以打印出洗牌矩阵。我认为我的代码遇到的问题是,每当我打印矩阵时,它实际上并不是在洗牌,而是实际上打印出一个全新的矩阵。我尝试的是在函数中调用函数,但这似乎不起作用。
这是我的代码:
#include <iostream>
#include <ctime>
#include <iomanip>
#include <cstdlib>
using namespace std;
const int ROW_SIZE = 10;
const int COLUMN_SIZE = 10;
void initialize(int [][10], int, int);
void display(int matrix[][10], int, int);
void shuffle(int matrix[][COLUMN_SIZE], int, int);
int main() {
int matrix [ROW_SIZE][COLUMN_SIZE];
initialize(matrix, ROW_SIZE, COLUMN_SIZE);
display(matrix, ROW_SIZE,COLUMN_SIZE);
shuffle(matrix, ROW_SIZE, COLUMN_SIZE);
display(matrix, ROW_SIZE,COLUMN_SIZE);
return 0;
}
void initialize(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
for (int i = 0; i < ROW_SIZE; i++){
for(int j = 0; j < COLUMN_SIZE; j++){
matrix[i][j] = 1 + rand() % 99;
}
}
}
void display(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
for(int i = 0; i < ROW_SIZE; i++){
for(int j = 0; j < COLUMN_SIZE; j++){
cout<< setw(4)<<matrix[i][j]<< " ";
}
cout<< endl;
}
}
void shuffle(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
for (int i = 0; i < ROW_SIZE; i++) {
for(int j = 0; j < COLUMN_SIZE; j++){
swap(matrix[i],matrix[j]);
}
}
}
解决方案
你的洗牌算法是错误的。它还假设行数与列数相同,如果不是,则会调用未定义的行为。它所做的一切都是通过矩阵与反向对应物交换整行。但是在进行了一半的迭代之后,它会在下半场将它们交换回来。它也不会对列进行任何交换。
您需要设置一个随机行和列选择器,然后将该位置与matrix[i][j]
. 完整的代码,包括用于设置序列矩阵的初始化程序的修改版本(从而在视觉上驱动 shuffle 的结果)如下:
#include <iostream>
#include <ctime>
#include <iomanip>
#include <cstdlib>
#include <random>
using namespace std;
const int ROW_SIZE = 10;
const int COLUMN_SIZE = 10;
void initialize(int [][10], int, int);
void display(int matrix[][10], int, int);
void shuffle(int matrix[][COLUMN_SIZE], int, int);
int main() {
int matrix [ROW_SIZE][COLUMN_SIZE];
initialize(matrix, ROW_SIZE, COLUMN_SIZE);
display(matrix, ROW_SIZE,COLUMN_SIZE);
shuffle(matrix, ROW_SIZE, COLUMN_SIZE);
display(matrix, ROW_SIZE,COLUMN_SIZE);
return 0;
}
void initialize(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
int x = 0;
for (int i = 0; i < ROW_SIZE; i++){
for(int j = 0; j < COLUMN_SIZE; j++){
matrix[i][j] = ++x;
}
}
}
void display(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
for(int i = 0; i < ROW_SIZE; i++){
for(int j = 0; j < COLUMN_SIZE; j++){
cout<< setw(4)<<matrix[i][j]<< " ";
}
cout<< endl;
}
cout << endl;
}
void shuffle(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
std::mt19937 prng{ std::random_device{}() };
std::uniform_int_distribution<> rdist(0, ROW_SIZE-1);
std::uniform_int_distribution<> cdist(0, COLUMN_SIZE-1);
for (int i = 0; i < ROW_SIZE; i++) {
for(int j = 0; j < COLUMN_SIZE; j++){
int x = rdist(prng);
int y = cdist(prng);
std::swap(matrix[x][y], matrix[i][j]);
}
}
}
输出(显然不同)
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70
71 72 73 74 75 76 77 78 79 80
81 82 83 84 85 86 87 88 89 90
91 92 93 94 95 96 97 98 99 100
36 22 28 32 47 29 2 65 10 48
76 86 64 56 25 8 91 70 75 6
52 40 87 97 23 9 53 39 59 74
84 61 43 3 38 69 60 81 83 42
19 72 49 67 27 80 44 55 18 16
96 37 46 79 4 12 17 41 11 30
73 66 71 14 54 77 57 45 88 93
63 89 100 33 58 50 85 95 68 26
34 35 7 1 51 92 21 90 15 99
94 24 62 13 82 31 78 5 20 98
推荐阅读
- regex - 谷歌分析目标漏斗
- javascript - 为什么我的 Mapbox GL 不能正确显示图块?
- php - 使用 require 'abc.php' 或 require('abc.php')
- php - Laravel:创建可以为空的 morphs() 关系
- java - 如何在我的 ssh 服务器上自动安装新的 jar 项目?
- python - 没有提供 argv 时如何打印错误
- web - 如何使用 Flutter Web 使用 OAuth2 (Identity Server 4) 登录?
- r - 如何在闪亮折线图R中进行数据集的反应功能
- ios - 有什么方法可以在 iOS Swift 中获取已连接 wifi 的 ssid?
- javascript - 上传前缩小图片大小