日期:2014-05-20  浏览次数:20734 次

想写个java程序实现双色球随机选号,目前碰到一个问题,怎么将0这个随机数去掉?
各位,小弟刚刚自学java,现在尝试用java实现双色球随机选号功能,但是碰到一些问题,请各位看看我的程序,应该怎么改?
谢谢了
Java code

package josephus.game;
import java.util.*;
import java.io.*;
public class Radom {
    public static void main(String[] args)throws Exception{
        Set<Integer> ns = new TreeSet<Integer>();//先new一个set集合,保存随机生成的Integer对象
        Random a=new Random();//用random方法实现随机选号
        OutputStream os=new FileOutputStream("ball.dat",true);//要将每次生成的随机号码放入数据文件
        ObjectOutputStream out=new ObjectOutputStream(os);//new一个对象流
        System.out.print("红球"+" ");
               //实现随机选6个红球
        while(true){
            ns.add(a.nextInt(34));
            if(ns.size()==6) break;//问题在这里:怎么实现 “先随机生成6个数,然后依次判断每个元素是否为0,若所有元素值不为0,跳出while循环”这个方法?
        }    
        System.out.print(ns+" ");//将红球打印出来
                //实现随机选1个蓝球
        Random b=new Random();
        System.out.print("蓝球"+" ");
        while(true){
                       if(b.nextInt(17)!==0) break;
            }
        System.out.println(b.nextInt(17));
        out.writeObject(ns);
        out.close();
        
    }

}


我知道用遍历看有没有0
比如:
Java code

for(Integer element:ns){
            System.out.println(element);    
            System.out.println(element==0);
            //if(element==0)break;
            }


现在我想问的是 在红球的while语句中,怎么实现 “先随机生成6个数,然后依次判断每个元素是否为0,若所有元素值不为0,跳出while循环”这个方法?也就是if(ns.size()==6&&“遍历每个元素,如果都不为0”) break;怎么实现?!跪求!

------解决方案--------------------
先用一个变量保持产生的随机数,判断不是0才加到ns里,到时候就不用再遍历了
------解决方案--------------------
是0就重新来。
------解决方案--------------------
ns.add(a.nextInt(33) + 1);
------解决方案--------------------
探讨
先用一个变量保持产生的随机数,判断不是0才加到ns里,到时候就不用再遍历了

------解决方案--------------------
5楼的不错
这样就不用判断为零了
------解决方案--------------------
探讨
ns.add(a.nextInt(33) +1);

------解决方案--------------------
将生成的6个数先保存在数组里,进行遍历,如果遇到0,则将该数重新用nextInt(34)获得,直到这六个数全不为0为止。
虽然不如ns.add(a.nextInt(33) +1)这个方法巧妙,但也符合楼主的要求!
------解决方案--------------------
Java code
while(true){
            ns.add(a.nextInt(34));
            if(ns.size()>=6&&!ns.contains(Integer(0)) ) break;        }

------解决方案--------------------
while(true){
if(b.nextInt(17)!==0) break;
}
System.out.println(b.nextInt(17));

楼主这个地方抽了两次蓝球阿
而且红色的部分写法不对哦
------解决方案--------------------
自己写了一个抽奖方法,仅供参考
Java code

import java.util.Hashtable;
import java.util.Random;
import java.util.TreeSet;

public class TestRandom1 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Hashtable result = getRandom(6,1,34,17);
        System.out.println("no1 is:"+result.get("no1").toString());
        System.out.println("no2 is:"+result.get("no2").toString());
    }
        //参数part1->要抽出第一部分的个数,也就是抽的6个红球
         //参数part1->要抽出第二部分的个数,也就是抽的1个蓝球
         //参数arrange1->红球的抽取范围
         //参数arrange2->蓝球的抽取范围

    static Hashtable getRandom(int part1,int part2,int arrange1,int arrange2){
        Hashtable<String ,TreeSet> result = new Hashtable<String,TreeSet>();        
        Random r = new Random();        
        
        TreeSet<Integer> no1 = new TreeSet<Integer>(); 
        while(no1.size()<part1){
            int temp = r.nextInt(arrange1);
            if(temp!=0){
                no1.add(temp);
            }            
        }
        
        TreeSet<Integer> no2 = new TreeSet<Integer>(); 
        while(no2.size()<part2){
            int temp = r.nextInt(arrange2);
            if(temp!=0){
                no2.add(temp);
            }    
        }
        
        result.put("no1", no1);
        result.put("no2", no2);
        
        return result;
    }
}