算法导论之第五章-引理4(如何生成随机排序)

package test2018.test08;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
* 曾经,在如何洗牌的算法时,是把第0位和random[0,53]交换,第1位和random[0,53]交换…
* 一直以为这是随机排序,但是今天看了新的排序方式,对此有疑惑,所有我把所有可能情况进行排列
* 发现,确实不是随机的
* 说个最简单的实例:0,1,2三个数排序,按照此方法有3*3*3=27种情况,而结果是A3 = 6种,27不能被6整除
* 事实证明,出现4次的有3个,出现5次的有3个
* 四个数和五个数差异更大
*
* Filename: Class7Jiaohuan.java Description: 123三个数,随机排序,第一位随机交换,第二位随机交换…
*
* @author: guzhangyan
* @date: 2018年8月7日 上午10:25:47
*/

public class Class7Jiaohuan {
    public static void main(String[] args) {
        int changDu = 5;
        Map<String, Integer> map = new HashMap<String, Integer>();
        int[] shuZu = new int[changDu];
        for (int i = 0; i < shuZu.length; i++) {
            shuZu[i] = i;
        }
        int temp;
        for (int i = 0; i < Math.pow(shuZu.length, shuZu.length); i++) {
            int[] weizhi = new int[changDu];
            temp = i;
            for (int j = 0; j < weizhi.length; j++) {
                weizhi[j] = temp % changDu;
                temp = temp / changDu;
            }
            int[] newShuZu = jiaoHuan(shuZu, weizhi);
            if (map.containsKey(Arrays.toString(newShuZu))) {
                map.put(Arrays.toString(newShuZu), map.get(Arrays.toString(newShuZu)) + 1);
            } else {
                map.put(Arrays.toString(newShuZu), 1);
            }
        }
        /*for (int i = 0; i < shuZu.length; i++) {
            for (int j = 0; j < shuZu.length; j++) {
                for (int k = 0; k < shuZu.length; k++) {
                    // 输出每一位和ijk交换后的结果
                    int[] weizhi = { i, j, k };
                    int[] newShuZu = jiaoHuan(shuZu, weizhi);
                    if (map.containsKey(Arrays.toString(newShuZu))) {
                        map.put(Arrays.toString(newShuZu), map.get(Arrays.toString(newShuZu)) + 1);
                    } else {
                        map.put(Arrays.toString(newShuZu), 1);
                    }
                }
            }
        }*/
        for (String key : map.keySet()) {
            System.out.println(key + "----" + map.get(key));
        }
    }

    private static int[] jiaoHuan(int[] shuZu, int[] weizhi) {
        int[] newShuZu = new int[shuZu.length];
        for (int kk = 0; kk < shuZu.length; kk++) {
            newShuZu[kk] = shuZu[kk];
        }
        int temp = 0;
        for (int i = 0; i < newShuZu.length; i++) {
            temp = newShuZu[i];
            newShuZu[i] = newShuZu[weizhi[i]];
            newShuZu[weizhi[i]] = temp;
        }
        return newShuZu;
    }
}

package test2018.test08;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
*
* 第0位可以和所有交换,第1位不能和第0位交换,第2位不能和之前两位交换…
*
* 经检验,每个可能性都会出现,而且都为1次,所有,是真随机
*
* @author: guzhangyan
* @date: 2018年8月7日 上午10:25:47
*/

public class Class7SuijiJiaohuan {
    public static void main(String[] args) {
        int changDu = 6;
        Map<String, Integer> map = new HashMap<String, Integer>();
        int[] shuZu = new int[changDu];
        for (int i = 0; i < shuZu.length; i++) {
            shuZu[i] = i;
        }
        int temp;
        int changDuTemp;
        for (int i = 0; i < jieCheng(shuZu.length); i++) {
            int[] weizhi = new int[changDu];
            temp = i;
            changDuTemp = changDu;
            for (int j = 0; j < weizhi.length; j++) {
                weizhi[j] = temp % changDuTemp + j;
                temp = temp / changDuTemp;
                changDuTemp--;
            }
            int[] newShuZu = jiaoHuan(shuZu, weizhi);
            if (map.containsKey(Arrays.toString(newShuZu))) {
                map.put(Arrays.toString(newShuZu), map.get(Arrays.toString(newShuZu)) + 1);
            } else {
                map.put(Arrays.toString(newShuZu), 1);
            }
        }

        for (String key : map.keySet()) {
            System.out.println(key + "----" + map.get(key));
        }
    }

    private static int[] jiaoHuan(int[] shuZu, int[] weizhi) {
        int[] newShuZu = new int[shuZu.length];
        for (int kk = 0; kk < shuZu.length; kk++) {
            newShuZu[kk] = shuZu[kk];
        }
        int temp = 0;
        for (int i = 0; i < newShuZu.length; i++) {
            temp = newShuZu[i];
            newShuZu[i] = newShuZu[weizhi[i]];
            newShuZu[weizhi[i]] = temp;
        }
        return newShuZu;
    }

    private static int jieCheng(int length) {
        if (length == 1) {
            return 1;
        }
        return length * jieCheng(length - 1);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_33321609/article/details/81477701
今日推荐