我需要制作一个代码,生成20个随机数,范围从0到20,条件是如果一个随机数与前一个重复,则计算该重复并将数字更改为一个未重复的数字重复。
我有这段代码:
int [] times = new int [21];
int[] randoms = new int [21];
for (int i = 0; i < 20; i++) {
times[i] = 0;
randoms[i]=(int)(Math.random()*21);
//System.out.print(i);
if(i>0){
for (int j = 1; j < i+1; j++) {
while(randoms[i]==randoms[i-(j)] || randoms[i]==randoms[0]){
System.out.print(i+" , "+j+" "+(i-j)+" * "+randoms[i]);
System.out.println();
randoms[i] = (int)(Math.random()*21);
times[i]=1+times[i];
}
}
JOptionPane.showMessageDialog(null, randoms[i]+" "+times[i]);
但是,当我运行代码时,有一些随机数字会重复,就像“while”不存在一样。 我该如何解决这个错误?
答案 0 :(得分:1)
这一行
randoms[i]=(int)(Math.random()*21);
不会在0 and 20
之间生成一个数字。相反,你应该把它改成像这样的东西
randoms[i]=(int)((Math.random()*100)%21);
另一个问题是,如果您发现该号码正在重复,那么您将其替换为另一个随机数,但您永远不会检查重新生成的号码是否重复,以检查它,您可以在重新生成随机数后再次设置j=0
的值,然后返回for
循环:
int [] times = new int [21];
int[] randoms = new int [21];
for (int i = 0; i < 20; i++) {
times[i] = 0;
randoms[i]=(int)((Math.random()*100)%21);
//System.out.print(i);
if(i>0){
outerloop:
for (int j = 1; j < i+1; j++) {
while(randoms[i]==randoms[i-(j)] || randoms[i]==randoms[0]){
System.out.print(i+" , "+j+" "+(i-j)+" * "+randoms[i]);
System.out.println();
randoms[i] = (int)((Math.random()*100)%21);
times[i]=1+times[i];
//recheck the entire loop again
j=1;
continue outerloop;
}
}
JOptionPane.showMessageDialog(null, randoms[i]+" "+times[i]);