2012-12-26 130 views
2

我需要用可能的50个5个随机数填充数组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); 
+3

我会在纸上绘制逻辑。你可以使用if-then逻辑,但我认为有很多方法可以为这个猫皮肤 – Coffee

+0

如果你使用'List'而不是数组,你可以利用[contains()](http://docs.oracle.com)。 com/javase/6/docs/api/java/util/List.html#包含%28java.lang.Object%29)方法。 –

回答

1

使用列表<>让所有允许号码的跟踪,并为你使用它们,从列表中删除。然后,对于你的第二次通过,而不是总是得到一个随机数* 50,得到一个随机数*列表大小()。那么你使用的实际数字是list.get(location)而不是数字。

(您的列表将以1,2,3,4,5开头,但当使用3时,列表将变为1,2,4,5,...,因此,当您获得3下一个“随机的()”号,这实际上是一个4)

0

商店的规模50

数组random你的50名随机数的候选人保持初始设置为random.length。所以一个柜台,这里counter将被初始化为49.

然后从0生成一个数字rcounter-1并选择random[r]作为您的号码。

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

现在只是如果你想,你以前没有选择一个数字,从0counter-1使random[r]来自阵列,这将是在年初的独特元素产生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; 
    } 

,只要你想,以允许重复,产生从0rrandom.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; 
    } 
0

您可以创建一个列表包含您的50个号码,并使用随机获得0-50的5个索引,创建你的第一个随机数组。

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

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

`

+0

谢谢!完美地解决了这个问题! – MarcusRey

+1

@ user1930614 ..不要只复制代码。试着了解究竟发生了什么。从长远来看,这将对你有所帮助。 –

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.