Java多维数组转置实现及Math.random范围修正求助
修正Java矩阵转置与随机数生成问题
1. 随机数范围修正
原代码生成的随机数仅覆盖-50到0区间,因为Math.random() * 50得到0 ≤ x < 50的浮点数,减50后范围被限制在-50 ≤ x < 0,无法覆盖0到50的数值。要生成-50到50(包含两端整数)的随机数,使用以下公式:
t[f][c] = (int) (Math.random() * 101) - 50;
原理:Math.random() * 101生成0 ≤ x < 101的浮点数,强转int后得到0到100的整数,减50即可覆盖-50到50的完整范围。
2. 矩阵转置逻辑修正
原代码的交换逻辑仅处理了对角线附近的少量元素,完全不符合转置要求。针对5x5方阵,提供两种可行修正方案:
方案一:原地转置(仅适用于方阵)
遍历矩阵的上三角区域(行号小于列号的元素),交换matrix[row][col]与matrix[col][row],避免重复交换:
for (f = 0; f < F; f++) { for (c = f + 1; c < C; c++) { int aux = t[f][c]; t[f][c] = t[c][f]; t[c][f] = aux; } }
方案二:新建矩阵存储转置结果(适用于所有矩阵)
若不想修改原矩阵或处理非方阵,新建一个C行F列的矩阵,将原矩阵元素[f][c]赋值给新矩阵的[c][f]:
int[][] transposed = new int[C][F]; for (f = 0; f < F; f++) { for (c = 0; c < C; c++) { transposed[c][f] = t[f][c]; } }
完整修正后的代码
以下是采用原地转置方案的完整代码,同时补充了转置后的打印逻辑:
final int F = 5; final int C = 5; int f, c, aux; int t[][] = new int[F][C]; // 生成-50到50的随机整数 for (f = 0; f < F; f++) { for (c = 0; c < C; c++) { t[f][c] = (int) (Math.random() * 101) - 50; } } System.out.println("Before transpose: "); for (f = 0; f < F; f++) { for (c = 0; c < C; c++) { System.out.printf("%3d ", t[f][c]); } System.out.println(); } System.out.println("\nAfter transpose: "); // 原地转置方阵 for (f = 0; f < F; f++) { for (c = f + 1; c < C; c++) { aux = t[f][c]; t[f][c] = t[c][f]; t[c][f] = aux; } } // 打印转置后的矩阵 for (f = 0; f < F; f++) { for (c = 0; c < C; c++) { System.out.printf("%3d ", t[f][c]); } System.out.println(); }
关键修改说明
- 随机数:调整生成公式,覆盖
-50到50的完整整数范围。 - 转置逻辑:替换原错误循环,通过上三角遍历交换实现正确的原地转置。
- 输出优化:调整格式符让矩阵输出更整齐,移除多余换行符避免空行。
内容的提问来源于stack exchange,提问作者jösü
相关产品推荐
相关产品推荐

