洗牌!打乱一组有序数

    xiaoxiao2021-03-25  85

    将一个有序数组打乱

    方法一:利用随机得到的索引一次交换

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

    转载请注明原文地址: https://ju.6miu.com/read-24245.html

    最新回复(0)