将一个有序数组打乱
方法一:利用随机得到的索引一次交换
import java.util.Arrays;
public class Test3 {
public static void main(String[] args) {
int[] m = new int[20];
// 创建一个有序数组
for (int i = 0; i < 20; i++) {
m[i] = i + 1;
}
System.out.println(Arrays.toString(m));
// 打乱有序数组
// 从下标 0 开始,与随机得到的下标 j 对应的元素交换
for (int i = 0; i < m.length; i++) {
int j = (int) (Math.random() * 20);
int t = m[i];
m[i] = m[j];
m[j] = t;
}
System.out.println(Arrays.toString(m));
}
}
方法二:利用洗牌时分成两半依次插入每张牌,最后合并的思想
import java.util.Arrays;
public class Test3 {
public static void main(String[] args) {
// 将一个有序序列打乱
// 思想:分两半洗牌,两半依次间隔插入
int[] test = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
System.out.println(java.util.Arrays.toString(test));
int[] test1 = new int[5];
int[] test2 = new int[5];
// 外层循环:两半依次间隔插入的次数,加强随机性
for (int k = 0; k < (Math.random() * 20 + 1); k++) {
// 将数组拆分成两半
for (int a = 0; a < test.length; a++) {
if (a < test.length / 2) {
test1[a] = test[a];
} else {
test2[a- (test.length / 2)] = test[a];
}
}
// 将两个拆分后的数组随机合并
int b = 0;
for (int a = 0; a < 5; a++) {
int rand = (int)(Math.random() * 2 + 1);
switch (rand) {
case 1:
test[b] = test1[a];
test[b+1] = test2[a];
b+=2;
break;
case 2:
test[b] = test2[a];
test[b+1] = test1[a];
b+=2;
break;
}
}
}
System.out.println("打乱有序序列");
System.out.println(java.util.Arrays.toString(test));
}
}