实际上,由于您的域限制为1到49之间的整数,因此最好使用布尔数组来指示数字是否已绘制:
public void populateArray(){ count = 0; boolean[] used = new boolean[50]; while (count < 6) { randomNumber = 1 + randomGen.nextInt(49); if (!used[randomNumber]) ++count; used[randomNumber] = true; } int j = 0; for (int i = 1; i < used.length; ++i) { numberLine[j++] = i; }}编辑
那仍然有潜在的无限循环。
您正在绘制49个中的6个数字,没有重复项。正确的解决方案是:
public void populateArray() { List<Integer> pool = new ArrayList<Integer>(); for (int i = 0; i < 49; ++i) { pool.add(i + 1); } for (int i = 0; i < 6; ++i) { randomNumber = randomGen.nextInt(pool.size()); numberLine[i] = pool.get(randomNumber); pool.remove(randomNumber); } Arrays.sort(numberLine);}有限循环,概率分布与原始循环相同。无需在遇到重复项时重试抽奖,只需消除预先绘制重复项的可能性。它基本上是在模仿真实的乐透状抽奖。



