使用随机非重复数字填充数组(如何更快地完成此操作)?

时间:2018-05-31 22:55:33

标签: java arrays

假设我想用一堆不重复的随机数填充数组。要求是,您必须使用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.
            }
        }
    }

4 个答案:

答案 0 :(得分:3)

如果你不能洗牌,最简单的方法是使用流:

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

您可以添加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;
    }        
}

答案 3 :(得分:0)

嗯,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;
}