钱富宝在央视的广告:大家试试这个JAVA程序,我第一次能用在用就用不了了
大家试试,高手回答下这是为什么?
public class Suiji{
public static void main(String[] args) {
int[][] si=new int[5][6];
int i,j,m,n,l,k=0;
for(i=0;i<5;i++){
for(j=0;j<6;){
si[i][j]=(int)(48.0*Math.random()+1);
for(m=0;m<j-1;m++)
if(si[i][j]==si[i][m]) k++;
if(k==0) j++;
}
}
for(n=0;n<5;n++){
System.out.println("\n"+(n+1)+":");
for(l=0;l<6;l++)
System.out.print(si[n][l]+" ");
}
}
}
if(si[i][j]==si[i][m]) k++;
if(k==0) j++;
这两句形成了死循环,把第一句后面加上
if(si[i][j]==si[i][m]) k++; else k=0;
就行了~
搂主的意思是不是每组里面的数字还不相同?
如果不是这样
要不然这段代码
for(m=0;m<j;m++)
{
if(si[i][j]==si[i][m]){
k++;
}
}
if(k==0){
j++;
}
就没什么用了
直接
for(i=0;i<5;i++){
for(j=0;j<6;j++){
si[i][j]=(int)(48.0*Math.random()+1);
}
}
就可以了
如果非要实现不能有重复数字的功能那就这样写
public class Suiji{
public static void main(String [] args) {
int[][] si=new int[5][6];
int i,j,m,n,l,k=0;
for(i=0;i<5;i++){
java.util.ArrayList al = new java.util.ArrayList();
for(j=0;j<6;){
do{
si[i][j]=(int)(48.0*Math.random()+1);
}while( al.contains(si[i][j]) );
al.add(si[i][j]);
j++;
}
}
for(n=0;n<5;n++){
System.out.println("\n"+(n+1)+":");
for(l=0;l<6;l++)
{
System.out.print(si[n][l]+" ");
}
}
}
}
主要的问题是程序陷入死循环(原因是没有在每一次检测重复性之前让 k 归零)的可能性大。
另一个问题是这个循环条件:m<j-1;
这条件意味着每次检测重复性时都会忽略 si[ i ][ j - 1 ] 。
两个问题都已通过对 for(m=0;m<j-1;m++) 的修改解决了(加了注释那一行):
class Suiji{
public static void main(String[] args) {
int[][] si=new int[5][6];
int i,j,m,n,l,k=0;
for(i=0;i<5;i++){
for(j=0;j<6;){
si[i][j]=(int)(48.0*Math.random()+1);
for(m=k=0;m<=j-1;m++) // 加 "=k" 及把 "<" 改成 "<="
if(si[i][j]==si[i][m])
k++;
if(k==0)
j++;
}
}
for(n=0;n<5;n++){
System.out.println("\n"+(n+1)+":");
for(l=0;l<6;l++)
System.out.print(si[n][l]+" ");
}
}
}
如果不一定要保存在数组里,而仅仅想打印出那 5 组随机数的话,可以这样表达:
import java.util.*;
class Random {
public static void main( String[ ] args ) {
for ( int row = 1; row <= 5; row++ ) {
Set set = new HashSet( ); // 利用 Set 不保存重复元素的特性
while ( set.size( ) < 6 )
set.add( new Integer( ( int ) ( 48 * Math.random( ) + 1 ) ) );
System.out.println( "\n" + row + ":" );
System.out.print( set ); // 容器内容的打印极端方便
}
}
}