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这是我的错。为了更好地反映原始描述,我将“所有独特”改为“不完全相同”。