随机选择矩阵的索引一次

时间:2017-01-10 18:05:06

标签: arrays algorithm matrix vector random

我有一个1的矩阵(只是一个2D矢量的int),我试图随机选择一个索引,这样我就可以将1转为0.我的目标是选择每个索引矩阵恰好一次,以便在运行具有与索引完全相同的迭代次数的for循环之后,矩阵将用0填充(0实际上并不重要,替换1的数字和1本身是任意的)。

我目前的做法很慢。它一直是运行一个while循环,检查每个传递以查看是否还有1个左边。这显然是非常低效,但我不知道如何为每个索引只执行一次这样的操作,并确保没有重复,以便我可以更改为for循环。任何建议都会非常有用!

3 个答案:

答案 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.从向量中删除指针。重复直到矢量为空。矩阵现在是空的。