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

5 回答 5

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。

于 2012-12-26T20:35:44.733 回答
1

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

(您的列表会以 1,2,3,4,5 开始,但是当使用 3 时,列表将变为 1,2,4,5,...,这样当您获得下一个“随机( )" 数字 3,实际上是 4。)

于 2012-12-26T20:27:55.273 回答
0

random将您的 50 个随机数候选者存储在一个大小为的数组中50

保持一个计数器最初设置为random.length.所以,这里counter将初始化为 49。

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

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

现在简单地说,如果您想要一个以前没有选择过的数字,请生成rfrom 0tocounter-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; 
    }

每当你想允许重复时,生成一个r0random.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; 
    }
于 2012-12-26T20:28:53.957 回答
0

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

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

于 2012-12-26T20:29:45.733 回答
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);

`

于 2012-12-26T20:29:54.310 回答