解决方案 »
- 如何以追加的、字符流的方式去写文件,然后能像C语言那样控制写入的格式,如%-12s,如果字符串长度小于12,自动补空格到12字符,从而实现每条记录全都对齐
- java 多线程和GUI僵死问题
- eclipse 创建jar文件后 不能调用第3方jar包
- 请问怎么用java编写串口呢,大哥门给点提示。谢谢
- 特殊字符串替换问题
- 第600分,散之
- 请问哪位应用过JIT技术把Java编译为机器码执行的?
- 使用applet(Jcreator)怎么能够产生文件打开和保存对话框?
- 请问下面一句语法有什么问题,急~~~~~~~~~~``
- j2由问题么?
- 一个类继承多接口,接口方法重名但返回值不同的问题
- 请教 正则表达式
虽然不如ns.add(a.nextInt(33) +1)这个方法巧妙,但也符合楼主的要求!
public class Traversing {
Traversing(){}
public boolean isTraversing(Set<Integer> set){//传入参数,如果有0,返回flase
return !(set.contains(new Integer(0)));
}
}在main()方法里面用if(ns.size()==6&&pd.isTraversing(ns)) break;判断
ns.add(a.nextInt(34));
if(ns.size()>=6&&!ns.contains(Integer(0)) ) break; }
if(b.nextInt(17)!==0) break;
}
System.out.println(b.nextInt(17));楼主这个地方抽了两次蓝球阿
而且红色的部分写法不对哦
import java.util.*;
import java.io.*;
public class Radom {
public static void main(String[] args)throws Exception{
Set<Integer> ns = new TreeSet<Integer>();
Traversing pd=new Traversing();
Random a=new Random();
OutputStream os=new FileOutputStream("ball.dat",true);
ObjectOutputStream out=new ObjectOutputStream(os);
System.out.print("红球"+" ");
while(true){
ns.add(a.nextInt(34));
if(ns.size()==6&&pd.isTraversing(ns)) break;
}
System.out.print(ns+" ");
System.out.print("蓝球 [");
System.out.println(a.nextInt(16)+1+"]");
out.writeObject(ns);
out.close();
}
}程序已经修改成这个样子,运行后可以得到不包含0的结果。但是,发现每运行几次之后就有点小问题。有时会只打印“红球”两字程序就不动了,为什么?
看图:
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;
}
}
执行结果
no1 is:[2, 3, 10, 14, 20, 24] //红球
no2 is:[7] //蓝球
最好别用ObjectOutputStream,它主要用来序列化,保存对象的
public static void main(String[] args) {
// TODO Auto-generated method stub
Hashtable result = getRandom(6,1,34,17);
try {
PrintWriter pw = new PrintWriter("c:/test/testRandom.txt");
pw.println(result.get("no1").toString());
pw.print(result.get("no2").toString());
pw.flush();
pw.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
while(true){
ns.add(a.nextInt(34));
if(ns.size()==6&&pd.isTraversing(ns)){
break;
}else{
ns.remove(new Integer(0));
}
}
有0后要删掉0,不然你While死循环
int code=rand.nextInt(set.size());
set.remove(code);上面的语句循环6次。选蓝球也一样的道理。
int i = a.nextInt(34));
if(!= 0)
ns.add(i);
if(ns.size()==6) break;//问题在这里:怎么实现 “先随机生成6个数,然后依次判断每个元素是否为0,若所有元素值不为0,跳出while循环”这个方法?
}
虽然有点笨, 应该好用,也不太啰唆 当然 +1 的办法 比较好
ns.add(a.nextInt(34));
if(ns.size()==6&&pd.isTraversing(ns)) break;
} 你每次都不先判断是否为0就往ns里面add,到了size等于6的时候且ns里面有0,就执行不了break,然后循环继续下去了,size不断增加且永远不会再等于6了,死循环出现了,当然也就停在了"红球".
if(ns.size()==6&&pd.isTraversing(ns))break;
问题处在这个判断上。加入ns.size()==6成立而后面条件不成立 ,则你就错过了唯一可以跳出循环的机会,所以一旦ns里面有0,你的程序就进入死循环了。
最简单..
就可以解决0的问题了
import java.util.Collections;
import java.util.List;
import java.util.Random;public class shuangseqiu {
public static void main(String[] args) {
List<Integer> redballs = new ArrayList<Integer>();
List<Integer> blueballs = new ArrayList<Integer>();
for(int i = 1;i < 34;i++)
redballs.add(i);
for(int i = 1;i < 17;i++)
blueballs.add(i);
Random rd = new Random();
int thisredball = 0;
List<Integer> rdredballs = new ArrayList<Integer>();
int rdblueball = rd.nextInt(blueballs.size())+1;
for(int i = 0;i < 6;i++){
thisredball = rd.nextInt(redballs.size())+1;
rdredballs.add(redballs.get(thisredball-1));
redballs.remove(thisredball-1);
}
Collections.sort(rdredballs);
System.out.print("红球 : ");
for(int i = 0;i < rdredballs.size();i++){
int iredball = rdredballs.get(i);
String sredball = null;
if(iredball < 10)
sredball = "0"+String.valueOf(iredball);
else sredball = String.valueOf(iredball);
System.out.print(sredball + " ");
}
String sblueball = null;
if(rdblueball < 10)
sblueball = "0"+String.valueOf(rdblueball);
else sblueball = String.valueOf(rdblueball);
System.out.println("蓝球 : " + sblueball);
}}
我的主程序是这样的,希望对你有些帮助:
package test.arrays.doublecolorball;
import java.util.*;
public class DoublecolorBall {
public static void main(String[] args) {
String [] pool={"01","02","03","04","05","06","07",
"08","09","10","11","12","13","14","15","16","17","18","19",
"20","21","22","23","24","25","26","27","28","29","30","31","32","33"};
boolean[] used=new boolean[pool.length];
String [] balls=new String[6];
Random ran=new Random();
int i=0;
while(true){//随机在pool数组中选择球,boolean为true则说明重复,跳出选择重新选。
int index=ran.nextInt(pool.length);
if(used[index]){
continue;
}
balls[i++]=pool[index];
used[index]=true;
if(i==balls.length){
break;
}
}
Arrays.sort(balls);
balls=Arrays.copyOf(balls, balls.length+1);
balls[balls.length-1]=pool[ran.nextInt(16)];
System.out.println(Arrays.toString(balls));//数组中,前六个数为红球,最后一位是蓝球。
}
}