题目:
编写一个程序ShuffleTest,接受命令行参数M 和N,将大小为M 的数组打乱N 次且在每次打乱之前都将数组重新初始化为a[i] = i。打印一个M×M 的表格,对于所有的列j,行i 表示的是i 在打乱后落到j 的位置的次数。数组中的所有元素的值都应该接近于N/M。
(题目来自《算法》练习题第1.1.36,下面中的部分代码用到该书中的stdlib.jar)
问题在代码的注释中:
java
public class quiz_1_1_36 { public static int[] shuffle(int[] a) { int N = a.length; for (int i = 0; i < N; i++) { int r = i + StdRandom.uniform( N - i ); //随机产生一个(i, N)之间的数r int temp = a[i]; a[i] = a[r]; a[r] = temp; } return a; } public static void shuffleTest(int m, int n) { int [][] s = new int[m][m]; for(int k = 0; k < n; k++) { //初始化数组 int[] a = new int[m]; for (int i = 0; i < m; i++) { a[i] = i; } //打乱数组 shuffle(a); //问题: i在打乱后落在j的位置上的次数?? //对于题目的这个要求看的不是很明白,行i表示的是i在打乱后落到j的位置的次数该怎样实现? } //输出 for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { StdOut.printf("%7d", s[i][j]); } StdOut.println(); } //问题: 怎样检查数组中的所有元素的值都应该接近于N/M ?? //用循环把每个数组中每个值遍历下,那怎么判定接近? } public static void main(String[] args) { int m = Integer.parseInt(args[0]); int n = Integer.parseInt(args[1]); shuffleTest(m, n); } }
下面这个是实现题目要求的程序(来自:这里),但是程序中的两个部分不懂,如下:
java
public class quiz_1_1_36 { public interface IShuffle //问题:这个作用是什么? { public void shuffle(int[] a); } public static void ShuffleTest(IShuffle shuffle, int m, int n) //问题:第一个参数是干嘛用的? { int[][] s = new int[m][m]; for (int k = 0; k < n; k++) { int[] a = new int[m]; for (int i = 0; i < m; i++) a[i] = i; shuffle.shuffle(a); for (int i = 0; i < m; i++) //这里是实现行i 表示的是i 在打乱后落到j 的位置的次数, s[i][a[i]]++; } for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) StdOut.printf("%7d", s[i][j]); StdOut.println(); } } public static void main(String[] args) { int m = Integer.parseInt(args[0]); int n = Integer.parseInt(args[1]); //问题:这段这样写是什么意思?? //---- IShuffle shuffle = new IShuffle() { public void shuffle(int[] a) { StdRandom.shuffle(a); //调用《算法》中的stdlib.jar中的StdRandom库中的随机将元素排序方法 } }; //------ ShuffleTest(shuffle, m, n); } }
用10 50做参数测试,运行后发现,貌似也没有实现检测数组中的所有元素的值都应该接近于N/M。
Definition
IShuffle
The purpose of this interface is to wrap the "shuffle" operation. The logic of the entire program can be summed up into two parts: 1. Scrambling the array; 2. Statistics of the scrambling results. TheShuffleTest()
method wraps the former into an interface, so that the method itself highlights the logic of the latter, making the entire code easier to understand.