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