我有一个1的矩阵(只是一个2D矢量的int),我试图随机选择一个索引,这样我就可以将1转为0.我的目标是选择每个索引矩阵恰好一次,以便在运行具有与索引完全相同的迭代次数的for循环之后,矩阵将用0填充(0实际上并不重要,替换1的数字和1本身是任意的)。
我目前的做法很慢。它一直是运行一个while循环,检查每个传递以查看是否还有1个左边。这显然是非常低效,但我不知道如何为每个索引只执行一次这样的操作,并确保没有重复,以便我可以更改为for循环。任何建议都会非常有用!
答案 0 :(得分:1)
只需在评论中提到的@Jonny生成矩阵索引的随机序列。然后遍历该序列的每个元素。以下是我刚刚编写的Java实现,以防它有用:
import java.util.Random;
public class Test {
public static void randomSelectMatrixIndex(int[][] matrix) {
int rows = matrix.length;
int cols = matrix[0].length;
int[] indices = new int[rows*cols];
System.out.println("Index array before shuffle: ");
for (int i=0; i<indices.length; i++) {
indices[i] = i;
System.out.print(i+" ");
}
System.out.println();
System.out.println();
shuffle(indices);
System.out.println("Index array after shuffle: ");
for (int j=0; j<indices.length; j++) {
System.out.print(indices[j]+" ");
matrix[indices[j]/cols][indices[j]%cols] = 0;
}
System.out.println();
System.out.println();
}
private static void shuffle(int[] indices) {
Random ran = new Random();
for (int i=indices.length; i>0; i--) {
int randomIndex = ran.nextInt(i);
int temp = indices[i-1];
indices[i-1] = indices[randomIndex];
indices[randomIndex] = temp;
}
}
private static void printMatrix(int[][] matrix) {
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
}
public static void main(String[] args) throws Exception {
int[][] matrix = {{1,1,1,1,1}, {1,1,1,1,1}, {1,1,1,1,1}, {1,1,1,1,1}};
System.out.println("Matrix before random select: ");
printMatrix(matrix);
System.out.println();
randomSelectMatrixIndex(matrix);
System.out.println("Matrix after random select: ");
printMatrix(matrix);
}
}
答案 1 :(得分:0)
你使用这种算法,虽然在经过大量迭代后效率仍然不是很高,但效率更高一些(请注意,为获得最佳结果,请使用均匀分布的随机数生成器):
select random index -> check if 1
| | |
| repeat |False |True
|--------------------| |--Change value at index to 0
|
|
the end
我想知道是否有一些东西可以改变以使其更有效......
答案 2 :(得分:0)
简单。使用嵌套循环创建指针向量,以便指向矩阵中的每个元素。随机选择一个指针。将值更改为0.从向量中删除指针。重复直到矢量为空。矩阵现在是空的。