我有一个数组,其中填充了6个随机生成的数字。首先,它生成一个介于1和49之间的随机数,然后将其与数组中的数字进行比较。如果发现重复,则应再次生成一个随机数,然后再次执行检查。如果没有重复项,则将数字添加到数组中。
这是代码:
public void populateArray() { for(int i = 0; i < numberLine.length; i++) { randomNumber = 1 + randomGen.nextInt(49); for(int j = 0; j < i; j++) { if (numberLine[j] == randomNumber) { i--; } else { continue; } } if(i >= 0) { numberLine[i] = randomNumber; } else { continue; } } Arrays.sort(numberLine); }
但是,由于某种原因,它仍然允许重复,尽管很少(大约50个数组中的1个),例如6 6 16 24 34 46。但是,当我尝试通过取出随机数元素并使用30这样的数字来重复此操作时,我无法重现结果。怎么了
6 6 16 24 34 46
实际上,由于您的域限制为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); }
有限循环,概率分布与原始循环相同。无需在遇到重复项时重试抽奖,只需消除预先绘制重复项的可能性。它基本上是在模仿真实的乐透状抽奖。