繁体   English   中英

创建一个包含随机整数但不重复的数组 [重复]

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM