while( s < 7 ){
      a[ s ] = (int)(Math.random()*29)+1;
      for( i = 0; i < s; i++ ){
            count++;
             if(a[ i ] == a[ s ]){
                   p = false;
                   break;
              }
       }
       if( p ){
            s++;
             p = true;
       }
  }我刚开始学JAVA,老师让做一个类似29选7的彩票的东西,就是在1~29中随机选7个不周的数字,我用上面的算法选的,有时候会正常执行,但有时候会进入死循环,一直没有结果。哪位高手帮我解决一下。谢谢了!

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【zhulin0001】截止到2008-07-08 14:51:24的历史汇总数据(不包括此帖):
    发帖的总数量:0                        发帖的总分数:0                        每贴平均分数:0                        
    回帖的总数量:0                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:0                        结贴的总分数:0                        
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:---------------------结分的百分比:---------------------
    无满意结贴率:---------------------无满意结分率:---------------------
    如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
      

  2.   

    random 会有负数,你应该用一个种子,比如Random ran = new Random();
    然后用 ran.nextInt(29); 返回一个1-29之间的数字。 你去看看APi吧。
      

  3.   

    sorry,理解错误,给你一个我的参考实现吧。
        int[] a = new int[7];
        int s = 0;
        int i;
        OUT: while (s < 7) {
          a[s] = (int) (Math.random() * 29) + 1;
          for (i = 0; i < s; i++) {
            if (a[i] == a[s]) {
              break OUT;
            }
          }
          s++;
        }
        System.out.println(Arrays.toString(a));
      

  4.   

    晕,这个简单。
    List list=new LinkedList();//里面放29个数
    for(int i=1;i<=29;i++){
      list.add(i);
    }
    int num=0;
    int[] number=new int[7];//存放7个选出来的数
    while(num<7){
    int pos=(int)(Math.random()*(list.size()-1))//这里随机选取一个位置,范围是从0到(list.size()-1)
    int t=list.remove(pos);//看见没有,这里选出来一个了。同时将它移出列表,剩下28个了。这样保证每次随机都选出一个数来
     number[num]=t;
     num++;
    }
      

  5.   

    给你付段代码吧,这个程序无论你想从多少个数中抽取多少个都没问题,是不是很方便啊,嘎嘎
    import java.util.*;
    public class ChouJiang {
    public static void main(String[] args) {
    Scanner in=new Scanner(System.in);
       System.out.print("你需要抽取多少个数?");
       int k=in.nextInt();
       System.out.print("你的数字最大的是多少?");
           int n=in.nextInt();
           int [] numbers=new int[n];
           for(int i=0;i<numbers.length;i++)
            numbers[i]=i+1;
           int[]  result=new int[k];
           for(int i=0;i<result.length;i++)
           {
              int r=(int)(Math.random()*n);
              result[i]=numbers[r];
              numbers[r]=numbers[n-1];
              n--;
           }
           Arrays.sort(result);
               for(int r=0;r<result.length;r++)
            System.out.println(result[r]);
    }}
      

  6.   

    当p变成false后,没有任何地方能把p变成true,同时,s也不能递增了。
    因此,当程序中第一次碰撞发生时,p变成了false,然后就死循环了。
    每次进入while循环后,重置p=true就可以了。
      

  7.   

    改了下5楼的方法,呵呵,学习了,import java.util.LinkedList;
    import java.util.List;public class Test_Num {
    public static void do1(){
    List list=new LinkedList();
    for(int i=1;i <=29;i++){ 
    list.add(i); 

    int num=0; 
    int[] nums=new int[7]; 
    while(num <7){ 
    int pos=(int)(Math.random()*(list.size()-1));
                            int get=Integer.parseInt(list.get(pos).toString());
    list.remove(pos);
                                nums[num]=get; 
    num++; 
    }
    for(int i=0;i<nums.length;i++){
    System.out.println(nums[i]);
    }
    }
    public static void main(String[] args){
    do1();
    }
    }
      

  8.   

    恩 看一下楼主的代码是
    当存在相当数字时p就赋值为false了
    因为没有赋值true的处理
    if( p ){ 
      s++; 
      p = true; // 这句是废的
    }
    这个判断就永不成立 进入死循环四楼的那样修改就可以了PS: 貌似这里 break OUT 和continue OUT 效果一样?PS: 0.0 <= Math.random() < 1.0
      

  9.   

    你是算发不太好啊!!想想如果 29个数中选20 个的话,那么将会有很多重复的,我给你个代码:
            int num=29;//29个数,可以更改
            int choice=7;//选7个数,也可以改
            int []a=new int[choice];
            int []b=new int[num];//存放所选的7个数
            int pos=0;
            int n;
            Random ran=new Random();
            for (int i = 0; i < b.length; i++) {//初始化那29个数,这里用1~29
                b[i]=i+1;
            }
            while(pos<choice){
                n=ran.nextInt(num)-1;//产生随即数,作为从29个数中要选的数的下标
                a[pos]=b[n];
                num--;
                b[n]=b[num];//将所选的数与最 后一个数交换,这样所选过的数将不会再次被选上
                pos++;

            }
      

  10.   

    11楼说出了lz程序的问题,我就不重复了
    写段代码吧int maxNum=29;
    int selectedNum=7;
    if(selectedNum>maxNum){
    throw new Exception("....");
    }
    List list=new ArrayList();
    for(int i=1;i <=maxNum;i++){ //i 从1开始 不包括0 注意
      list.add(new Integer(i)); 
    }
    List selectedList=new ArraryList();
    for(int i=0;i<selectNum;i++){
     int pos=(int)(Math.random()*(list.size()-1))
     Object temp=list.remove(pos);
    selectedList.add(temp);

    }
    selectedList 中就是你想要的东西 
    =============
      

  11.   

    不好意思,刚给的程序还有点问题,因为nextInt(num)产生0~num的数,所以n=ran.nextInt(num)-1有可能会是负数.
    可以在:n=ran.nextInt(num)-1后面加一条语句
    if(n<0)
      n=n+1;
    这样就没问题了..呵呵
      

  12.   

    修正一下
    这里应该用continue OUT 不是break    int[] a = new int[7];
        int s = 0;
        int i;
        OUT: while (s < 7) {
          a[s] = (int) (Math.random() * 29) + 1;
          for (i = 0; i < s; i++) {
            if (a[i] == a[s]) {
              continue OUT;//用break当存在重复时会直接结束循环
            }
          }
          s++;
        }
        System.out.println(Arrays.toString(a));
      

  13.   

    p = false; //这个导致了死循环
    当你有2个数重复了的时候p是false下面if里的代码根本走不到,s就不会++所以就挂了。
    你可以参考一下楼上各位大虾的代码。
      

  14.   


         就这句(int) (Math.random() * 29) + 1;
        其他的自己写啦
       
      

  15.   

    谢谢各位了,4楼5楼9楼12楼14楼15楼17楼的算法都挺好的。
    int a[] = new int[ 29 ];
    int b[] = new int[ 7 ];
    int n = a.length;
    for( i = 0; i < n; i++){
    count++;
    a[ i ] = i+1;
    }
    for( i=0; i < b.length; i++){
    count++;
    int r = (int)(Math.random()*n);   
                b[i] = a[r];       
                a[r] = a[n-1];     //move   the   last   element   to   the   location   r.   
                n--;   
                System.out.print(b[i]+"\t");   //print   
            }  
    当时我在另外一个贴子里看到并采用了上面这个算法。感谢11楼13楼18楼指出我代码中的错误,非常感谢。
    你们都帮我了,我想给你们都加分,这是我第一次在CSDN上发贴,谁教教我怎么给分啊??
      

  16.   

    感谢11楼13楼18楼指出我代码中的错误,非常感谢!
    感谢上面给我提供算法的所有人,后来我在另外一个贴子里看到了下面的算法
    int a[] = new int[ 29 ];
    int b[] = new int[ 7 ];
    int n = a.length;
    for( i = 0; i < n; i++){
    count++;
    a[ i ] = i+1;
    }
    for( i=0; i < b.length; i++){
    count++;
    int r = (int)(Math.random()*n);   
                b[i] = a[r];       
                a[r] = a[n-1];     //move   the   last   element   to   the   location   r.   
                n--;   
                System.out.print(b[i]+"\t");   //print   
            }  
    贴出来大家也看看,我是新手,也不知道这个和你们上面发的有没有相同的。
      

  17.   

    最后一个p=true应该移出if语句
      

  18.   

    最后一个p=true应该移出if语句
      

  19.   

    最后一个p=true应该移出if语句