我需要用可能的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);
答案 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。
然后从r
到0
生成一个counter-1
的号码,并选择random[r]
作为您的号码。
现在继续将random[r]
与random[counter-1]
交换。递减counter
,以便下次只搜索数组的前49个元素,并在选择数字时继续此过程。
现在,如果你想要一个之前没有选择过的数字,请从r
生成0
到counter-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
生成0
到random.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);
`