Java 这是怎么变得不再重复的?

Java 这是怎么变得不再重复的?,java,arrays,Java,Arrays,我想把这个改成唯一的号码,不重复…怎么做? 请给我一些建议,以改变这个代码的问题。。。 我需要20个唯一的号码,我需要让他们成为唯一的,没有重复在同一行。。。 这是老师给我的问题: import java.lang.*; // import java.util.Random; class UniqueRandomIntArray { // static Random rnGen = new Random(); private static void uriArray(int[]

我想把这个改成唯一的号码,不重复…怎么做? 请给我一些建议,以改变这个代码的问题。。。 我需要20个唯一的号码,我需要让他们成为唯一的,没有重复在同一行。。。 这是老师给我的问题:

import java.lang.*; 
// import java.util.Random;

class UniqueRandomIntArray {

//   static Random rnGen = new Random();

   private static void uriArray(int[] rray) {
      int low = 0;
      int high = 50;

      int rn;
      int haveit = 0;
      int i = 0; 
      int j;

      while((haveit == 0) && i < rray.length) {  
         rn = randNum(low, high);

         for(j = 0; j <= i; j++) {
            if(rn == rray[j]) {
               haveit = j;
               j = i;
               }
            }

         if(haveit != 0) {
            System.out.println("a[" + haveit + "] is " + rn + " already");
            haveit = 0;
            }
         else {
            System.out.println("a[" + i + "] is " + rn);
            rray[i] = rn;
            i++;
            }

         }   // end while
      }      // end uriArray


   private static int randNum(int min, int max) {
      int range = (max - min) + 1;
//      int randnum = rnGen.nextInt(range) + min;
      int randnum = (int) (Math.random() * range) + min;
      return randnum;
      }


   public static void main(String[] args) {
      int[] arra = new int[20];
      uriArray(arra);
      for(int i=0; i<arra.length; i++)  {
         System.out.print(" | " + arra[i]);
         }
      System.out.println(" | ");
      }

   } //class ends
一个简单的方法是使用Collections.shuffle


Radnom不能保证唯一性

在我看来,你可以做两件事:

建议一:

生成20个不同的间隔 从每个间隔中取一个随机数 由于间隔不重叠,因此您的数字是随机且唯一的 使用集合。使用数字对集合进行洗牌 建议二:

迭代某个时间间隔 定义接受概率 调用Math.random并查看您的值是否高于或等于此概率 如果是,则将数字添加到数组中,否则跳过 当你有20个号码时停止 使用集合。使用数字对集合进行洗牌
您的问题的一个更简单的解决方案是使用一个集合来存储随机数,并在[0,50]范围内不断向该集合添加新的随机数,直到有20个为止:

public static int[] getRandNums() {
    Set<Integer> randNums = new HashSet<Integer>();

    Random randomGenerator = new Random();
    do {
        int randomInt = randomGenerator.nextInt(50);  // generate random number between
        randNums.add(randomInt);                      // 0 and 50

        if (randNums.size() == 20) break;             // exit the loop at 20 numbers
    } while(true);

    Integer[] resultInt = randNums.toArray(new Integer[0]);
    int[] result = new int[resultInt.length];
    for (int ctr=0; ctr < resultInt.length; ++ctr) {
        result[ctr] = resultInt[ctr].intValue();
    }

    return result;                                    // return numbers as an array
}
用法:


我选择不严格遵守您的原始代码,因为它很凌乱。

您的代码几乎可以正常工作,但您可以使用数组中的第一个值创建一个副本

你的问题是,你用0来检查你没有那个号码,所以,如果你已经在索引0上有这个号码,你会认为你没有这个号码。您可以使用-1而不是0:

改变

改变


创建包含每个候选编号的列表。用来洗牌。将前20个元素复制到结果数组。

的默认haveit值为-1,而不是0。因为0可能是haveit的有效值。

我应该把它放在哪里?所以我需要像你一样设置新数组?我不知道你在问什么。如何对重复的数字进行排序?请检查下面的答案,如果它解决了你的问题,请标记一个正确的答案。
public static int[] getRandNums() {
    Set<Integer> randNums = new HashSet<Integer>();

    Random randomGenerator = new Random();
    do {
        int randomInt = randomGenerator.nextInt(50);  // generate random number between
        randNums.add(randomInt);                      // 0 and 50

        if (randNums.size() == 20) break;             // exit the loop at 20 numbers
    } while(true);

    Integer[] resultInt = randNums.toArray(new Integer[0]);
    int[] result = new int[resultInt.length];
    for (int ctr=0; ctr < resultInt.length; ++ctr) {
        result[ctr] = resultInt[ctr].intValue();
    }

    return result;                                    // return numbers as an array
}
public static void main(String[] args) {
    int[] array = getRandNums();
    for (int i=0; i< array.length; ++i) {
       System.out.print(" | " + arra[i]);
    }
    System.out.println(" | ");
}
int haveit = 0;
int haveit = -1;
while ((haveit == 0) && i < rray.length) {
while ((haveit == -1) && i < rray.length) {
if(haveit != 0) {
    System.out.println("a[" + haveit + "] is " + rn + " already");
    haveit = 0;
}
if(haveit != -1) {
    System.out.println("a[" + haveit + "] is " + rn + " already");
    haveit = -1;
}