Java中如何创建含等量0和1的数组并随机打乱其内容?
嘿,这个问题我刚好有不少实践经验,分两步给你讲得明明白白~
一、创建包含等量0和1的数组
首先要注意:数组的长度必须是偶数,不然根本没法做到0和1的数量完全相等。如果有人传入奇数长度,最好直接抛出异常或者给出提示,避免逻辑错误。
这里给你两种简单的实现方式:
方法1:分两段填充(最直观)
先填充前半段为0,后半段为1,代码清晰易懂:
int targetLength = 8; // 比如要创建8个元素的数组(4个0,4个1) if (targetLength % 2 != 0) { throw new IllegalArgumentException("数组长度必须是偶数,才能保证0和1数量相等!"); } int[] zeroOneArr = new int[targetLength]; int halfLength = targetLength / 2; // 填充前半部分为0 for (int i = 0; i < halfLength; i++) { zeroOneArr[i] = 0; } // 填充后半部分为1 for (int i = halfLength; i < targetLength; i++) { zeroOneArr[i] = 1; }
方法2:单次循环交替填充(可选)
如果你想一开始就让0和1交替出现(虽然之后还要打乱,但这个写法也可行):
int targetLength = 10; if (targetLength % 2 != 0) { throw new IllegalArgumentException("数组长度必须是偶数!"); } int[] zeroOneArr = new int[targetLength]; for (int i = 0; i < targetLength; i++) { // 偶数索引放0,奇数索引放1 zeroOneArr[i] = i % 2 == 0 ? 0 : 1; }
二、对数组进行随机打乱(Shuffle)
洗牌的核心是要保证每个元素的位置都是随机且无偏的,这里推荐两种方案:
方案1:手动实现Fisher-Yates洗牌算法(高效推荐)
这是业界公认的无偏洗牌算法,性能好,不需要依赖集合类,直接操作数组:
import java.util.Random; public static void shuffleIntArray(int[] arr) { Random random = new Random(); // 从数组末尾开始向前遍历 for (int i = arr.length - 1; i > 0; i--) { // 生成0到i之间的随机索引(包含i) int randomIndex = random.nextInt(i + 1); // 交换当前元素和随机索引的元素 int temp = arr[i]; arr[i] = arr[randomIndex]; arr[randomIndex] = temp; } }
原理很简单:每次把当前位置的元素和前面随机一个位置的元素交换,这样能确保所有排列出现的概率相等,不会有偏向性。
方案2:利用Java标准库的Collections.shuffle(便捷但稍显繁琐)
如果不想自己写算法,可以用JDK自带的工具类,但要注意:Collections.shuffle只支持List类型,所以需要先把int数组转成包装类的List:
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; // 先把int数组转成Integer类型的List Integer[] integerArr = Arrays.stream(zeroOneArr).boxed().toArray(Integer[]::new); List<Integer> numList = new ArrayList<>(Arrays.asList(integerArr)); // 执行洗牌 Collections.shuffle(numList); // 如果需要转回int数组 int[] shuffledArr = numList.stream().mapToInt(Integer::intValue).toArray();
这个方法的优点是不用自己实现算法,缺点是需要做数组和集合的转换,对于超大数组来说,性能会比手动实现的Fisher-Yates略差一点。
完整示例代码
把创建和洗牌整合到一起,你可以直接运行测试:
import java.util.Arrays; import java.util.Random; public class ZeroOneArrayDemo { public static void main(String[] args) { // 1. 创建等量0和1的数组 int targetLength = 10; if (targetLength % 2 != 0) { System.err.println("错误:数组长度必须为偶数,无法创建等量0和1的数组!"); return; } int[] zeroOneArr = new int[targetLength]; int halfLength = targetLength / 2; for (int i = 0; i < halfLength; i++) { zeroOneArr[i] = 0; } for (int i = halfLength; i < targetLength; i++) { zeroOneArr[i] = 1; } System.out.println("初始数组:" + Arrays.toString(zeroOneArr)); // 2. 打乱数组 shuffleIntArray(zeroOneArr); System.out.println("打乱后数组:" + Arrays.toString(zeroOneArr)); } private static void shuffleIntArray(int[] arr) { Random random = new Random(); for (int i = arr.length - 1; i > 0; i--) { int randomIndex = random.nextInt(i + 1); int temp = arr[i]; arr[i] = arr[randomIndex]; arr[randomIndex] = temp; } } }
内容的提问来源于stack exchange,提问作者Tianshu Li
相关产品推荐
相关产品推荐

