数组中的随机数

时间:2012-12-26 20:10:36

标签: java arrays algorithm random

我需要用可能的50个随机数填充数组A.允许重复。然后我需要第二次填充相同的数组,但是具有未出现在数组的第一次或第二次填充中的唯一数字。我使用下面的代码第二次生成数组。我坚持如何同时搜索第一个数组中的重复项。任何帮助赞赏!感谢

boolean drawn;
    for (int i=0; i<A.length; i++) {
            do {
                    drawn = false;
                    A[i] = 1 + (int)(Math.random() * 50);


                    for (int j=0; j<i; j++)
                            if (A[i] == A[j]) 
                                drawn = true;                                                                               

            } while (drawn);

5 个答案:

答案 0 :(得分:1)

使用列表&lt;&gt;跟踪所有允许的数字,并在使用时将其从列表中删除。然后,对于你的“第二遍”,而不是总是得到一个随机数* 50,得到一个随机数*列表大小()。然后你使用的实际数字是list.get(location)而不仅仅是number。

(你的列表将以1,2,3,4,5开头,但是当使用3时,列表将变为1,2,4,5,...,那么当你得到下一个“random()”数字为3,实际上是4。)

答案 1 :(得分:1)

我会这样做:

List<Integer> choices = new ArrayList<Integer>();  
Random r = new Random();
for(int i = 0; i <N;i++)
{  
    choices.add(r.nextInt(N-1)+1;
}    
Set<Integer> uniques = new HashSet<Integer>();  
Collections.shuffle(uniques);  
//remove first 5 entries from uniques 
//repeat for second pass  

这当然有可能(尽可能最小)剩下的小于5的小组。

答案 2 :(得分:0)

将50个随机数候选者存储在大小为random

的数组50

将计数器初始设置为random.length。因此,此处counter将初始化为49。

然后从r0生成一个counter-1的号码,并选择random[r]作为您的号码。

现在继续将random[r]random[counter-1]交换。递减counter,以便下次只搜索数组的前49个元素,并在选择数字时继续此过程。

现在,如果你想要一个之前没有选择过的数字,请从r生成0counter-1,以便random[r]来自数组中的唯一元素这将是最开始的。

    int[] randoms= new int[50];
     .
     .  //populate your array with the candidate numbers
     .
    int counter= randoms.length;
    Random rand = new Random();

    public int getUnique(){
      //Get a random number in the range 0 to counter-1
      int r = rand.nextInt(counter);
      int myElement = randoms[r];
      randoms[r] = randoms[counter-1];
      randoms[counter-1]= myElement;
      counter--;
      return myElement; 
    }

每当您想要允许重复时,请从r生成0random.length -1并选择random[r]作为您的号码。请注意,我们仍然需要跟踪使用的数字,以便getUnique()仍然有效:

    public int getAny(){
      //Get a random number in the range 0 to random.length-1
      int r = rand.nextInt(random.length);
      int myElement = randoms[r];
      if(r < counter){
        randoms[r] = randoms[counter-1];
        randoms[counter-1]= myElement;
        counter--;
      }
      return myElement; 
    }

答案 3 :(得分:0)

您可以创建一个包含50个数字的列表,并使用Random来获得0到50之间的5个索引,以创建您的第一个随机数组。

对于第二遍,创建第一个列表的副本,但删除第一个随机数组中的数字。然后随机播放第二个列表(使用Collections.shuffle()),然后取5个第一个元素。

答案 4 :(得分:0)

每次要填充数组时,必须使用一个额外的数组,因为您需要存储以前的数组元素。类似的东西:

boolean drawn;
System.arraycopy( A, 0, B, 0, A.length );
for (int i=0; i<A.length; i++) {
        do {
                drawn = false;
                A[i] = 1 + (int)(Math.random() * 50);

                for (int j=0; j<A.length; j++)
                        if (A[i] == B[j]) 
                            drawn = true; 

                for (int j=0; j<i; j++)
                        if (A[i] == A[j]) 
                            drawn = true;                                                                               

        } while (drawn);

`