【问题标题】:Duplicate number check doesn't always work重复号码检查并不总是有效
【发布时间】:2018-11-10 11:13:34
【问题描述】:

我有一个函数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;
    }
}

例如,如果结果是[4,4,4]for 循环会生成新数字。然而它仍然能够输出 3 个相同的整数。为什么?

【问题讨论】:

  • @Eran 那是我的错误。我已将“所有独特”更改为“不完全相同”以更好地反映原始描述。

标签: java for-loop if-statement random


【解决方案1】:

您需要一个嵌套循环。您的 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);
}

【讨论】:

    【解决方案2】:

    您当前的代码失败了,因为如果它生成重复列表,它只是将其清除并生成一个新列表,不检查新列表是否包含重复项。这是我建议的替代解决方案:

    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;
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

      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);
          }
      

      【讨论】:

      • 允许重复,只要它们不全部相同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      • 2021-12-25
      相关资源
      最近更新 更多