如何使这成为不重复?

时间:2015-06-11 09:05:58

标签: java arrays

我想将此更改为唯一编号,不重复...怎么样? 请给我一些改变这些代码问题的建议...... 我需要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

6 个答案:

答案 0 :(得分:1)

一种简单的方法是使用Collections.shuffle()

    //create list of 50 integers in order 0..49
    List<Integer> intlist = new ArrayList<Integer>();
    for (int n=0; n<50; n++) intlist.add(n);

    //randomize the order
    Collections.shuffle(intlist);

    //print the list
    for (int n : intlist) {
        System.out.println(n);
    }

答案 1 :(得分:1)

Math.Radnom()不保证唯一性。

你可以在我的脑海里做两件事:

建议一:

  • 生成20个不同的间隔
  • 从每个间隔中取一个随机数
  • 由于间隔不重叠,因此您的数字是随机且唯一的
  • 使用Collections.shuffle对您的号码进行收集

建议二:

  • 迭代一段时间
  • 定义接受概率
  • 调用Math.random()并查看您的值是否高于或等于此概率
  • 如果是,请在数组中添加数字,否则跳过
  • 当你有20个号码时停止
  • 使用Collections.shuffle对您的号码进行收集

答案 2 :(得分:0)

解决问题的一个简单方法是使用override func viewDidLoad() { super.viewDidLoad() var startScroll = insideScrollView.bounds.width if cities != nil { for model in cities.cityModels { if model.selected { cityScrollView.addSubview(buildView(startScroll, model: model)) startScroll += cityScrollView.bounds.width } } } else { var cityModel: CityModel = CityModel(name: "default") cityModel.selected = false cities = SearchCityModels.sharedInstance cities.cityModels.append(cityModel) } } 来存储随机数,并在[0,50]范围内向此集合添加新的随机数,直到您有20个:< / p>

Set

<强>用法:

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
}

我选择不严格遵守原始代码,因为它太乱了。

答案 3 :(得分:0)

您的代码几乎正常工作,但您可以使用数组中的第一个值重复。

您的问题在于0使用haveit检查您是否没有该号码,因此,如果您已在索引0处拥有该号码,你会认为你没有它。您可以使用-1代替0

  • 变化

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

答案 4 :(得分:0)

创建一个包含每个候选号码的列表。使用Collections.shuffle对其进行随机播放。将前20个元素复制到结果数组。

答案 5 :(得分:0)

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