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);
}
}