【问题标题】:How to build a random integer array of distinct elements? [duplicate]如何构建不同元素的随机整数数组? [复制]
【发布时间】:2022-01-05 10:10:39
【问题描述】:

我正在尝试创建一种方法,该方法用没有重复元素的随机整数填充数组。我无法确保放入新数组的每个元素都是不同的。

例如。如果 numOfDigits 是 5,那么我想要 [3][8][2][6][1] 之类的东西。目前它要么输出类似 [9][0][1][0][0] 的东西,要么无限循环。

  private static int[] hiddenSet(int numOfDigits){
    int[] numArray = new int[numOfDigits];
    int temp;
    for (int i = 0; i < numArray.length;  i++){
      do {
        temp = getRandomNum(10);
        numArray[i] = temp;
      } while (isDigitNew(numArray, temp));
      //Each random num must be unique to the array
    }
    return numArray;
  }

  private static boolean isDigitNew(int[] numArray, int index){
    for (int i = 0; i < numArray.length; i++) {
      if (numArray[i] == index) {
        return false;
      }
    }
    return true;
  }

【问题讨论】:

  • 您可以使用调试器单步执行您的程序以查看发生了什么。你确定你发布的代码已经完成了吗?
  • 一行实现。 return IntStream.generate(() -&gt; ThreadLocalRandom.current().nextInt(numOfDigits)).distinct().limit(numOfDigits).toArray();

标签: java arrays for-loop methods boolean


【解决方案1】:

一种简单的方法是用不同的数字填充数组,然后随机播放。

public static int[] getRandomDistinct(int length) {
    Random rand = new Random();
    int[] array = new int[length];

    // Fill with distinct digits
    for (int i = 0; i < length; i++) {
        array[i] = i;
    }

    // Swap every element with a random index
    for (int i = 0; i < length - 1; i++) {
        int swapWith = i + rand.nextInt(length - i);

        int tmp = array[i];
        array[i] = array[swapWith];
        array[swapWith] = tmp;
    }

    return array;
}

【讨论】:

  • 哎呀,我的意思是使用nextInt(length) 将其保持在数组范围内。
  • 我可能是错的,但这看起来可能是biased
  • @trashgod 我根据nextInt 的输出制作了一张可能的结果表,结果确实有点偏差。在实践中它可能不会被注意到,但是对于长度为 4 的数组,不同的变体可能在 8/4 的概率上有所不同!到 15/4!。我修改了答案,现在改组应该是完全随机的,因为它只从剩余的未选择元素中进行选择。
  • 我认为随机数的最大值应该是10(包括或不包括)这是getRandomNum()的参数。
【解决方案2】:

您的算法最多需要二次时间。当随机数的选择变得更少时,循环可能需要很长时间。甚至无限可能。

在前面生成的数字上加上一个正随机数 + 1。需要注意所需的数字范围。

在他结束洗牌。如果从列表开始,则可以使用集合。随机播放。

【讨论】:

    【解决方案3】:

    你可以像这样使用IntStream

    private static int[] hiddenSet(int numOfDigits) {
        return IntStream.iterate(getRandomNum(10), i -> getRandomNum(10))
            .distinct()
            .limit(numOfDigits)
            .toArray();
    }
    

    public static void main(String[] args) {
        int[] a = hiddenSet(5);
        System.out.println(Arrays.toString(a));
    }
    

    输出:

    [7, 4, 5, 0, 1]
    

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      相关资源
      最近更新 更多