You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:26:44