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

为何数组排序后前两个索引值恒为0?Mega Millions彩票生成器问题

Mega Millions彩票随机数生成器问题排查与修复

需求描述

开发类似Mega Millions彩票的随机数生成器,需生成5行数据:

  • 每行包含5个1至70的不重复随机数
  • 每行末尾附带1个1至25的额外数字(Mega Ball)

原代码与问题输出

原Java代码

import java.util.Arrays;
import java.util.Collections;
import java.util.Random;

public class MegaMillions {
    
    public void play() {
        Random rand = new Random();
        int[] numbers = new int[5];
        for(int i = 0; i < 5; i++) {
            numbers[i] = rand.nextInt(69) + 1;
            Collections.shuffle(Arrays.asList(numbers));
            Arrays.sort(numbers);
            System.out.print(numbers[i] + " ");
        }
        Collections.shuffle(Arrays.asList(numbers));
        int megaBall = rand.nextInt(24) + 1;
        System.out.println("(" + megaBall + ")");
    }

}

运行输出

0 0 21 21 35 (1)

0 0 16 26 32 (9)

0 0 39 39 53 (3)

0 0 22 37 51 (14)

0 0 18 18 60 (14)

问题原因分析

  1. Collections.shuffle未生效:
    Arrays.asList(numbers)传入的是int[]基本类型数组,该方法会把整个数组作为单个元素存入List,而非将每个int拆分为List元素。因此shuffle操作只是对包含一个元素的List做打乱,完全起不到打乱数组元素的作用。

  2. 循环逻辑导致前两位为0:
    数组初始化时默认值为0,循环中每次仅给numbers[i]赋值,其余未遍历到的位置仍为0。随后执行Arrays.sort(numbers)会把0排在数组最前面,当循环前两次(i=0、i=1)时,numbers[i]就是未被覆盖的0,所以输出前两位总是0。

  3. 无去重逻辑:
    原代码直接生成随机数存入数组,没有检查重复,导致出现重复数字(如输出中的21、39等)。

修复后的代码

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class MegaMillions {

    public void play() {
        Random rand = new Random();
        // 生成5行数据
        for (int line = 0; line < 5; line++) {
            // 生成1-70的数字列表,打乱后取前5个确保不重复
            List<Integer> numberList = new ArrayList<>();
            for (int i = 1; i <= 70; i++) {
                numberList.add(i);
            }
            Collections.shuffle(numberList);
            List<Integer> selectedNumbers = numberList.subList(0, 5);
            // 排序
            Collections.sort(selectedNumbers);
            // 输出5个数字
            for (int num : selectedNumbers) {
                System.out.print(num + " ");
            }
            // 生成Mega Ball(1-25)
            int megaBall = rand.nextInt(25) + 1;
            System.out.println("(" + megaBall + ")");
        }
    }

    public static void main(String[] args) {
        new MegaMillions().play();
    }
}

修复说明

  • 用ArrayList<Integer>存储1-70的所有数字,shuffle后取前5个,确保数字不重复。
  • 对选中的5个数字排序后输出,符合彩票号码的展示习惯。
  • 每行单独生成Mega Ball,范围正确为1-25(rand.nextInt(25)生成0-24,加1后得到1-25)。
  • 外层循环控制生成5行数据,满足需求。

内容的提问来源于stack exchange,提问作者user1091091

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:05:55