[英]Create an array with random integers but with no duplicates [duplicate]
我需要一个解决方案来创建一个具有随机值且没有重复的数组。 我的问题是当我创建一个没有重复项的数组时,它会删除重复项并使我的数组保持一些 0 值。
如何创建具有特定索引的数组,而不是仅删除重复项,而是将其更改为另一个值,
注意:它只能使用常规数组而不是集合来完成,因为它是流程控制中的一项任务。
// *Initializing first array with random numbers*
for (int i = 0; i < guesses.length; i++) {
guesses[i] = rand.nextInt(10) + 1;
}
// *Creating a second array while removing duplicates*
int[] array2 = new int[5];
int index = 0;
lbl: for (int i = 0; i < guesses.length; i++) {
int x = guesses[i];
for (int j = 0; j < index; j++) {
if (array2[j] == x) {
continue lbl;
}
}
array2[index++] = x;
}
有重复的数组:
[6, 9, 8, 5, 5, 6]
删除重复项后得到的结果(如您所见,我有两个 0)
[6, 9, 8, 5, 0, 0]
我需要什么的例子:
[6, 9, 8, 5, 3, 1]
我想你正在尝试这个:
guesses[]// you define
for (int i = 0; i < guesses.length; i++) {
boolean exist = true;//we create a boolean is random number exist and start with true for while loop
while(exist){
exist = false;//we change it because until we didn't see the same value on array, we accept as non-exist.
int x = rand.nextInt(10) + 1;
for(int k = 0; k < i; k++){//we check everynumber until "i" we come.
if(x == guesses[k]){//if exist we said same value exist
exist = true; break;}
}
if(!exist){//if same value not exist we save it in our array
guesses[i] = x;}
}
}
遵循您已有的相同想法,您的问题是 Java 中的数组以默认值开始,因此,假设您创建了一个大小为 10 的数组,该数组将填充为 ints 的默认值(即 0)。
您需要做的是保留一个带有数组“实际大小”的索引,因此当您向数组添加元素时,您会增加计数器,而当您删除时,您会减少计数器。 也就是说,您应该使用此实际大小来知道将新号码放在哪里。
请注意,此解决方案不需要额外的数组。
这种方法基本上使用所谓的基于数组的列表,也许研究一下可以帮助你。
这是几种可能的解决方案之一。
请注意,随机数的范围与数组的长度相比越大,重复出现的次数就越少,算法运行的速度也就越快。
相反,如果随机数的范围小于数组的大小,则该方法将永远不会完成。 (例如,您不能用1 to 5
的范围填充大小为10
的数组,并且不能有重复项)。
Random r = new Random();
int[] guesses = r.ints(20,1,20).toArray();
int N = guesses.length;
// Start searching for duplicates
for (int i = 0; i < N;) {
int check = guesses[i];
for (int x = 0; x < i; x++) {
// check for duplicate
// if found, assign new value and check again.
if (guesses[x] == check) {
guesses[x] = r.nextInt(N)+1;
// rest i to start the outer loop anew.
i = -1;
break;
}
}
i++;
}
// now sort to show distinctiveness.
Arrays.sort(guesses);
System.out.println(Arrays.toString(guesses));
对于当前的练习和值,打印。
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
另一种方法是将范围基于先前生成的数字的最大值。 在这种情况下,我选择了start and range
来生成序列号,以便它们相邻并排序。 增加 start 的值会分散数字,但它们仍然会被排序。 请注意,这些不符合随机数的条件,因为它们是根据先前选择的值生成的。
int range = 2;
int start = 1;
int[] vals = new int[20];
int max = Integer.MIN_VALUE;
for (int i = 0; i < vals.length; i++) {
vals[i] = r.nextInt(start) + range;
// need to maintain the max generate thus far
// to avoid overlap and possible duplication
max = vals[i] > max ? vals[i] : max;
range = max+1;
}
System.out.println(Arrays.toString(vals));
印刷
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.