具有10个不同随机元素的数组,没有重复

时间:2014-09-20 23:10:28

标签: java arrays random

我试图用Random()创建10个不同元素的数组,所以基本上我有这个

public static int[] RandomArray (int xArra[]) throws java.io.IOException {
    Random Rand = new Random();
    int nal;

    for (int i = 0; i < xArra.length; i++) {
        nal = Rand.nextInt(11); /*I would like to make this thing work with any 
                                numbers, for example, changing this to 50 or 100.
                                In an array of 10 elements it should be 
                                impossible to have a duplicate because with 
                                11 it just prints from 1 to 10. 
                                Thats why i put 11 here.  */  
        for ( int j = 0; j < xArra.length; j++) {
            if (nal == xArra[j]) {
                nal = Rand.nextInt(11); 
                j=0;                  
            }                           
        }

        xArra[i] = nal;

    }           

    return xArra;

}

基本上我在nal中存储一个随机数,然后我在一秒钟内运行我的数组For For check 这个已经给定的随机数,如果它等于数组中给出的任何数字,它再次随机改变它,并运行For再次检查新数字是不重复的,如果不是,我存储在xArra [i ]

当我运行3次时,结果如下:

首先运行: 8 1 6 4 3 2 10 8 9 7

第二轮: 9 3 8 10 7 1 4 五 9 6

第三轮: 3 五 2 3 6 7 1 4 10 9

所以,你可以看到我几乎虽然我有它,但它只重复1个数字,没有2或3,所以基本上我只想让这个东西工作。我只想打印10个随机数,没有重复,没有重复。

见下我的完整代码:

import java.io.*;
import java.util.*;

public class ArraynoR {

    public static void main (String[] args) throws java.io.IOException {
        int Array[]= new int [10];
        RandomArray(Array);
        for(int i=0; i<Array.length; i++){
            System.out.println("Array[" + (i + 1) + "]:" + Array[i]);   
        }
    }

    public static int[] RandomArray (int xArra[]) throws java.io.IOException... //up

}

请原谅我的英语不好,我希望自己解释一下。

谢谢!

3 个答案:

答案 0 :(得分:2)

创建一个包含感兴趣范围内的数字的ArrayList,而不是存储和搜索重复项。使用Collections.shuffle()随机化值,然后从混乱集中选择任意数量的值。保证不提供重复,并且比搜索/拒绝方法更有效。

附录

也许不是最漂亮的代码,但它起作用并给出了这个想法......

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

public class ShuffleDemo {

   public static int[] RandomArray(int len) {
      ArrayList<Integer> al = new ArrayList<Integer>(len);
      for(int i = 1; i <= len; ++i) {    // initialize the ArrayList with values 1 to len
         al.add(i);
      }
      Collections.shuffle(al);           // shuffle to random order
      int[] results = new int[len];
      // switching return type to ArrayList could eliminate the following loop
      for(int i = 0; i < len; ++i) {     // copy to array of ints
         results[i] = al.get(i);         // note: create a subset by reducing
      }                                  // the upper bound for this loop                               
      return results;
   }

   public static void main(String[] args) {
      System.out.println(Arrays.toString(RandomArray(10)));
   }
}

答案 1 :(得分:0)

当您为内部for循环重置时设置j = -1并尝试它。然后它应该工作

    for ( int j = 0; j < xArra.length; j++) {
        if (nal == xArra[j]) {
             nal = Rand.nextInt(11); 
             j=-1;                  
        }                           
    }

在for循环结束时,循环递增变量,所以当你将它设置为0时,在下一次检查之前它由于for循环的内部代码而变为1

答案 2 :(得分:0)

您可以在Apache Math中使用类org.apache.commons.math3.random.RandomDataGenerator的方法nextPermutation(请参阅此处的帮助docs)。此方法生成随机数而不重复。