关于随机数生成指定二维数组的问题

Java随机数生成二维数组,我想生成一个只有数字1-16且不重复的二维数组。
比如我能否用循环生成随机数组的方式方式生成{{7,8,9,10},{4,5,6,3},{2,1,11,15},{16,12,13,14}}
这样的数组。当找到这样的数组后停止循环,输出数组,求代码及思路。

不要这样玩,先生成有序数组,再随机打乱顺序。效率比较高

        int[][] arr=new int[4][4];
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                arr[i][j]=i*4+j+1;
                System.out.print(arr[i][j]+"  ");
            }
        }
        System.out.println();
        int[][] arr1=shullArrays(arr, 50);
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr1[i][j]+"  ");
            }
        }
    }
    public static int[][] shullArrays(int[][] arr,int n){
        int x=(int) Math.floor( Math.random()*4);
        int y=(int) Math.floor( Math.random()*4);
        int x1=(int) Math.floor( Math.random()*4);
        int y1=(int) Math.floor( Math.random()*4);
        int temp;
        for (int i = 0; i < n; i++) {
            temp=arr[x][y];
            arr[x][y]=arr[x1][y1];
            arr[x1][y1]=temp;
             x=(int) Math.floor( Math.random()*4);
             y=(int) Math.floor( Math.random()*4);
             x1=(int) Math.floor( Math.random()*4);
             y1=(int) Math.floor( Math.random()*4);
        }
        return arr;
    }

生成一个只有数字1-16且不重复的二维数组
可以先生成一个1-16的列表
然后从这些数值中随机选出几个,再从剩下部分随机选出几个,一直持续到选完
就OK啦

了解,现在生成了二维数组,我想判断数组是否满足横行,数列和斜线之和为34才将数组输出。我这边试了,弹出Exception in thread "main" java.lang.StackOverflowError错误。我想用Java程序找出满足这个条件的数组,比如{{1,15,14,4},{12,6,7,9},{8,10,11,5},{13,3,2,16}}这样的数组,可行不?