刚刚学习JAVA2周,突然想到做一个彩票的开彩程序,搞半天搞不成功,看得别人写了一段代码,经过简单修改,得到下面:import java.util.*;
public class RandomTxt {
static int ball_set=10;    
static int balls=40;             public static void main(String[] args) {
        int[] data = new int[balls ];
        
        for(int k=0;k<balls;k++){
        
         data[k]=k;
        }
        Random rand = new Random();
        
        int irdm = 0;
        
        for(int i = 0; i < ball_set; i ++) {
        
            irdm = rand.nextInt(balls-i);
                                   
            System.out.print(data[irdm]+" "); 
                     
            for(int j = irdm; j < balls - i - 1; j ++) {
            
             data[j] = data[j + 1];
                
           }
          
      }
     }
}让我头大的是2个FOR循环,特别是最后一个循环for(int j = irdm; j < balls - i - 1; j ++) {
            
             data[j] = data[j + 1];和第一个循环有什么回应呢?虽然通过分解运行知道,这个FOR是剔除重复元素用的,但是算法忍让百思不得其解,望大家赐教。另外:
import java.util.Random;
public class Randi {

static int ball_set=7;
static int balls=30;
   
public static void main(String[] args) {   
Random rand=new Random();    
int snum[]=new int[ball_set];
   
for(int i=0;i<snum.length;i++) {
int o= rand.nextInt(balls);

        loop:
        for(int j=0;j<snum.length;j++){
       
while(o==snum[j]){
o= rand.nextInt(balls);
continue loop;
}

          }

snum[i]=o;

        System.out.println("number="+snum[i]);    
}
   
 }
}
这个事我写了个另外的程序,这个程序为什么不能去除重复的数组元素呢?望各位赐教~~谢谢

解决方案 »

  1.   

    外层循环用来产生一个data的随机下标,内层循环排除数组中随机到的这个下标的值,
    比如,随机到irdm=5,内曾循环做的事就是从下标为6的元素开始依次覆盖前一个值,也就是说如果irdm下次又随机到5,但这个值已经被下标为6的元素值覆盖,就避免重复了。
    如果还不清楚就自己画一下图,就很清晰了。
      

  2.   

    3个循环第一个是赋值不多讲,第二个外循环是产生随即下标,外循环循环一次随机产生一个下标,同时随机机器rand的随机范围也从rand.nextInt(39)变为rand.nextInt(38)意味这你下次循环出来的下标不可能超过38,而内循环恰好利用这个空挡把你循环得到的这个数x移到下标为39的那个位置即data[39]=x,而这个data[39]是你整个过程中再也访问不到的元素了!  以此类推 ! 得到的后移便可..
       建议兄弟  代码的格式规范一点要注意这有助于代码的理解!
     
      

  3.   

    你自己写的那个continue loop是没有用的,你可以试下把loop和continue loop 去掉,while语句的最后加j=0