java - 为什么这个程序不停止数组中的重复项?
问题描述
我正在尝试编写一个生成六个随机整数的程序,并将它们返回给用户,而没有任何数字重复。为什么重复仍然通过?
我在谷歌上搜索过并尝试了一些结果,但似乎没有一个有效。我想到了自己的方法来尝试解决此问题,方法是执行以下操作:
使用 for 循环,我一次将一个数字从drawnNums
(具有六个随机数的数组)存储在numToCheck
. 还有一个变量numOfDuplicates
存储它找到的那个数字的数量。使用另一个 for 循环,我遍历所有数字drawnNums
并将其与 进行比较numToCheck
,然后将 1 添加到numOfDuplicates
. 它显然找到了自己,所以我有一个 if 语句,仅numOfDuplicates
在 >= 2 时重绘数字。这是在我创建数组的同一个函数中,所以它应该创建一个新数组并再次检查,重绘直到没有重复。
在我看来,这应该会阻止返回重复项,但事实并非如此。
这是来自我为生成数组而创建的类,以及我上面描述的内容。
// Private function to draw one random number
private int drawNumber() {
return random.nextInt(maxNum) + 1;
}
// Function to randomly draw six numbers using drawNumber() and store in an array
int[] draw() {
int[] drawnNums = {0, 0, 0, 0, 0, 0};
for (int i = 0; i < drawnNums.length; i++) {
int draw = drawNumber();
drawnNums[i] = draw;
}
// Check if there are any duplicates in the array, if there are, redraw
int numOfDuplicates = 0;
for (int x = 0; x < drawnNums.length; x++) {
int numToCheck = drawnNums[x];
numOfDuplicates = 0;
for (int y = 0; y < drawnNums.length; y++) {
if (numToCheck == drawnNums[y]) {
numOfDuplicates++;
}
if (numOfDuplicates >= 2) {
draw();
}
}
break;
}
return drawnNums;
}
}
我希望如果数组中有重复项,则将重新绘制数字,直到有一个没有重复项的数组。但是当反复运行程序时,仍然有一些数组有重复。
解决方案
您想在添加之前检查可返回数组中的重复项。换句话说,一旦draw变量接收到一个新的随机值,请查看该值是否已包含在drawNums数组中:
private int[] draw() {
int[] drawnNums = {0, 0, 0, 0, 0, 0};
boolean alreadyHave;
for (int i = 0; i < drawnNums.length; i++) {
int draw = drawNumber();
alreadyHave = false;
for (int j = 0; j < drawnNums.length; j++) {
if (draw == drawnNums[j]) {
alreadyHave = true;
i--;
break;
}
}
if (!alreadyHave) {
drawnNums[i] = draw;
}
}
return drawnNums;
}
推荐阅读
- python - sklearn 错误 - 我已经填写了列的缺失值,但仍然面临以下错误
- javascript - 多维数组 - 递归 / Javascript 简介
- java - Spring 无法获取 JDBC 连接
- python - 使用 pandas 我们如何制作不同的文本组(来自 PDF 输出)并给他们特定的组 ID?
- meteor - 如何为我的应用程序目录提供正确的权限以运行 docker-compose up?
- cytoscape.js - 在 cytoscape 鼠标悬停时显示和隐藏节点信息
- php - 仅当 laravel 5.2 中的 status = '1' 时才登录用户
- excel - 如何在vba中填写activecell
- asp.net-core - 如何使用 httpClientFactory 配置证书
- javascript - 我可以在目标/特定浏览器选项卡中打开链接吗?