为何数组排序后前两个索引值恒为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)
问题原因分析
Collections.shuffle未生效:Arrays.asList(numbers)传入的是int[]基本类型数组,该方法会把整个数组作为单个元素存入List,而非将每个int拆分为List元素。因此shuffle操作只是对包含一个元素的List做打乱,完全起不到打乱数组元素的作用。循环逻辑导致前两位为0:
数组初始化时默认值为0,循环中每次仅给numbers[i]赋值,其余未遍历到的位置仍为0。随后执行Arrays.sort(numbers)会把0排在数组最前面,当循环前两次(i=0、i=1)时,numbers[i]就是未被覆盖的0,所以输出前两位总是0。无去重逻辑:
原代码直接生成随机数存入数组,没有检查重复,导致出现重复数字(如输出中的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
相关产品推荐
相关产品推荐

