【问题标题】:Bug in random array generator随机数组生成器中的错误
【发布时间】:2016-01-02 11:22:40
【问题描述】:

如果数组大小设置为小于数字可以采用的值范围,您能否告知为什么这种随机数组生成器方法有效,但否则它不起作用。例如,如果n = 10max = 100,则方法有效。但如果n = 10max = 5 则不会返回任何内容。

另外,有人能解释一下为什么在这里使用boolean markDup 变量吗?

提前感谢您的见解。

public static int[] getRandomArray(int n, int max) {
        Random random = new Random();
        int[] randomArray = new int[n];
        for (int j = 0; j < n;) {

            int randomNumber = random.nextInt(max - 1);

            boolean markDup = false;
            for (int indexRandomArray = 0; indexRandomArray < n; indexRandomArray++) {
                if (randomArray[indexRandomArray] == randomNumber) {
                    markDup = true;
                    break;
                }
            }

            if (!markDup) {
                randomArray[j] = randomNumber;
                j++;
            }

        }

        for(int x:randomArray) System.out.print(x+" "); 
        System.out.println(); 
        return randomArray;
    }

【问题讨论】:

    标签: java arrays random generator


    【解决方案1】:

    如果n10 并且max5,那么你最终会陷入无限循环。

    在生成“随机”数字 0、1、2 和 3 后,随后生成的每个数字都将被标记为重复。

    markDup 始终为true 时,永远不会执行j++

    【讨论】:

    • 其实生成的数字是0..3
    【解决方案2】:

    很明显,您正在检查此行中的数字是否重复if (!markDup) {,当然,当您设置的最大值小于数组大小时,将永远不会填满整个数组,因为没有足够的数字和@ 987654322@永远不会增加,所以循环会无限运行

    【讨论】:

      【解决方案3】:

      这是一个固定版本(不会在生产中运行,随机性很弱)

      public class Test {
      
          public static int[] getRandomArray(int n, int max, boolean allowDups) {
      
              if (!allowDups && n > max) {
                  throw new IllegalArgumentException();
              }
      
              Random random = new Random();
              int[] randomArray = new int[n];
              outer: for (int j = 0; j < n;) {
      
                  int randomNumber = random.nextInt(max - 1);
      
                  if (!allowDups) {
                      for (int indexRandomArray = 0; indexRandomArray < j; indexRandomArray++) {
                          if (randomArray[indexRandomArray] == randomNumber) {
                              continue outer;
                          }
                      }
                  }
      
                  randomArray[j] = randomNumber;
                  j++;
      
              }
      
              for (int x : randomArray)
                  System.out.print(x + " ");
              System.out.println();
              return randomArray;
          }
      
          public static void main(String[] args) {
              getRandomArray(10, 5, true);
              getRandomArray(9, 10, false);
              getRandomArray(10, 100, false);
              getRandomArray(5, 1000, false);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-06
        相关资源
        最近更新 更多