【问题标题】:Fill an array with random non-repeating numbers (How Can I Do This Quicker)?用随机的非重复数字填充数组(我怎样才能更快地做到这一点)?
【发布时间】:2018-11-11 00:47:47
【问题描述】:

假设我想用一堆不重复的随机数填充一个数组。要求是,您必须使用来自 java.util.Random 的 Random 类,不能使用 ArrayList(我已经使用 Collections.shuffle 做到了。您只能使用一维数组和任何类型的循环(包括 if 语句)。在为了解决这个问题,我做了一个225的数组,随机数不允许超过225。这是我想出的解决方案,但似乎效率不高。我怎样才能更快地做到这一点?

我用从 1 到 225 的随机数填充了数组。我将数组的每个元素与其他所有元素进行了比较,如果有一个相似之处,我将从 0 元素重新开始比较。我在下面包含了我的源代码。

    int [] value = new int[225]; 
    int randnum;
    Random num = new Random();

    for (int x = 0; x < value.length; x++) // Fills array with Random Numbers from 0 to 225
    {
        randnum = (num.nextInt(225)) + 1;
        value[x] = randnum;
    }

    for (int y = 0; y < value.length; y++) // These two loops compare each value of the array
    {
        for (int z = y + 1; z < value.length; z++)
        {
            while (value[y] == value[z])
            {
                value[y] = num.nextInt(225) + 1;
                y = 0; // If the loop runs, the entire looping process starts over again.
            }
        }
    }

【问题讨论】:

    标签: java arrays


    【解决方案1】:

    好吧,shmosel 是最巧妙的解决方案。但是,如果保持您最初尝试的精神,您可以先用顺序成员填充您的数组,然后使用 Random 来实现您自己的 shuffle。

    int [] value = new int[225]; 
    int randnum;
    Random num = new Random();
    
    for (int x = 0; x < value.length; x++) 
    {
        value[x] = x+1;
    }
    
    for (int x = 0; x < value.length - 1; x++)
    {
        int r = num.nextInt(225 - x) + x;
        int tmp = value[x];
        value[x] = value[r];
        value[r] = tmp;
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用布尔数组来检查已添加的值,方法是使用生成的数字作为索引,这将为您提供恒定的查找速度。您只需循环数组一次。只需使用生成的随机数作为布尔数组的索引,如果该数字的索引为假,那么我们找到了一个新数字。如果生成的数字不包含真,那么我们继续生成另一个随机数,直到找到该数字的假值。

      int size = 225;
      int [] value = new int[size];
      boolean [] valuesCreated = new boolean[size + 1];
      
      int randnum;
      Random num = new Random();
      
      for (int x = 0; x < value.length; x++) // Fills array with Random Numbers from 0 to 225
      {
          do{
              randnum = (num.nextInt(value.length)) + 1;
          }while(valuesCreated[randnum] == true);
      
          value[x] = randnum;
          valuesCreated[randnum] = true;
      }
      

      请注意,这会将值随机放入数组中,但是此方法按顺序生成值的可能性最小,但数组越大,这样做的可能性就越小。

      【讨论】:

        【解决方案3】:

        可以加flag查看 不使用 HashMap 或 Hashset 或 ArrayList 的类似的东西

        boolean isThere = false;
        for (int x = 0; x < value.length; x++) // Fills array with Random Numbers from 0 to 225
        {
            randnum = (num.nextInt(225)) + 1;
            for(int i =0;i<value.length;i++){
              if(value[i] == randnum){
                isThere = true;
              }
            }
            if(!isThere){
              value[x] = randnum;
              isThere = false;
            }        
        }
        

        【讨论】:

          【解决方案4】:

          如果不能随机播放,最简单的方法是使用流:

          int count = 225;
          int[] value = new Random()
                  .ints(1, count + 1)
                  .distinct()
                  .limit(count)
                  .toArray();
          

          【讨论】:

            猜你喜欢
            • 2013-03-30
            • 1970-01-01
            • 2022-11-09
            • 1970-01-01
            • 1970-01-01
            • 2015-05-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多