Java 重复编号检查不存在';我不总是工作
我有一个函数Java 重复编号检查不存在';我不总是工作,java,for-loop,if-statement,random,Java,For Loop,If Statement,Random,我有一个函数getNormalList(),它必须返回一个包含3个0-5的随机整数的列表,但不尽相同。它不像我希望的那样工作。有时,尽管进行了检查,它还是输出相同的3个数字 public class SpinResultGenerator { public ArrayList<Integer> getNormalList() { ArrayList<Integer> integerList = new ArrayList<Integer&g
getNormalList()
,它必须返回一个包含3个0-5的随机整数的列表,但不尽相同。它不像我希望的那样工作。有时,尽管进行了检查,它还是输出相同的3个数字
public class SpinResultGenerator {
public ArrayList<Integer> getNormalList() {
ArrayList<Integer> integerList = new ArrayList<Integer>();
Random r = new Random();
int Low = 0;
int High = 6;
for (int i = 0; i < 3; i++) {
int number = r.nextInt(High - Low) + Low;
integerList.add(number);
}
if (integerList.get(0) == integerList.get(1) && integerList.get(0) == integerList.get(2)
&& integerList.get(1) == integerList.get(2)) {
integerList.clear();
for (int i = 0; i < 3; i++) {
int number = r.nextInt(High - Low) + Low;
integerList.add(number);
}
}
return integerList;
}
public ArrayList<Integer> getJackpotList() {
ArrayList<Integer> integerList = new ArrayList<Integer>();
integerList.add(5);
integerList.add(5);
integerList.add(5);
return integerList;
}
}
公共类SpinResultGenerator{
公共ArrayList getNormalList(){
ArrayList integerList=新的ArrayList();
随机r=新随机();
int低=0;
int高=6;
对于(int i=0;i<3;i++){
整数=r.nextInt(高-低)+低;
整数列表。添加(数字);
}
if(integerList.get(0)=integerList.get(1)&&integerList.get(0)=integerList.get(2)
&&integerList.get(1)=integerList.get(2)){
integerList.clear();
对于(int i=0;i<3;i++){
整数=r.nextInt(高-低)+低;
整数列表。添加(数字);
}
}
返回整数列表;
}
公共阵列列表getJackpotList(){
ArrayList integerList=新的ArrayList();
整数列表。添加(5);
整数列表。添加(5);
整数列表。添加(5);
返回整数列表;
}
}
例如,如果结果是
[4,4,4]
,则for
循环将生成新的数字。但它仍然能够输出3个相同的整数。为什么?您需要一个嵌套循环。应该重复for循环,直到找到3个可接受的数字。我使用数组使代码更加紧凑,但同样可以使用ArrayList
public List<Integer> getNormalList() {
Random r = new Random();
int[] arr = new int[3]; // initialized to 0s by default
int Low = 0;
int High = 6;
while (arr[0] == arr[1] && arr[1] == arr[2]) { // will repeat as long as the 3 number as
// all equal
for (int i = 0; i < arr.length; i++) {
arr[i] = r.nextInt(High - Low) + Low;
}
}
return Arrays.asList(arr);
}
public List getNormalList(){
随机r=新随机();
int[]arr=new int[3];//默认情况下初始化为0s
int低=0;
int高=6;
而(arr[0]==arr[1]&&arr[1]==arr[2]){//将重复3个数字,直到
//一律平等
对于(int i=0;i
您可以这样做:
public ArrayList<Integer> getNormalList() {
Set<Integer> resultSet = new HashSet<>(3);
Random r = new Random();
int Low = 0;
int High = 6;
while (resultSet.size() < 3) {
resultSet.add(r.nextInt(High - Low) + Low);
}
return new ArrayList<>(resultSet);
}
public ArrayList getNormalList(){
Set resultSet=newhashset(3);
随机r=新随机();
int低=0;
int高=6;
while(resultSet.size()<3){
结果加(r.nextInt(高-低)+低);
}
返回新的ArrayList(resultSet);
}
当前代码失败,因为如果它生成重复列表,它只会清除该列表并生成一个新列表,而不检查新列表是否包含重复项。以下是我建议的替代解决方案:
do {
List<Integer> result = ThreadLocalRandom.current().ints(0, 6).limit(3).boxed().collect(toList())
} while (result.get(0) == result.get(1) && result.get(0) == result.get(2))
return result;
do{
列表结果=ThreadLocalRandom.current().ints(0,6).limit(3).boxed().collect(toList())
}而(result.get(0)=result.get(1)&&result.get(0)=result.get(2))
返回结果;
允许重复,只要它们不完全相同。@Eran这是我的错。为了更好地反映原始描述,我将“所有独特”改为“不完全相同”。