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个不周的数字,我用上面的算法选的,有时候会正常执行,但有时候会进入死循环,一直没有结果。哪位高手帮我解决一下。谢谢了!
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个不周的数字,我用上面的算法选的,有时候会正常执行,但有时候会进入死循环,一直没有结果。哪位高手帮我解决一下。谢谢了!
解决方案 »
- java目录分隔符的问题,其中"/"和"//"代表什么意思
- 为什么g2.draw(new Point2D.Double(180,180)不能通过编译啊?
- io流的一道代码填空题目,大家帮忙看一下~~~
- 要通过键盘移动一幅图片,该怎么处理?将图片装入标签中,通过键盘消息重画图片可行吗?
- resin "sun.tools.javac.Main"过时
- 谁能帮我解释一下下面的程序。。。。。。。。
- 请问:private DialogWindow parent;错了吗?
- 请教如何学java
- ListCellRenderer 是做什么用的?
- 帮我看一看下面的这个错误是什么原因?
- 有意思的小算法,谁把代码贴上???
- 大家讨论下CMS吧
楼主【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
然后用 ran.nextInt(29); 返回一个1-29之间的数字。 你去看看APi吧。
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));
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++;
}
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]);
}}
因此,当程序中第一次碰撞发生时,p变成了false,然后就死循环了。
每次进入while循环后,重置p=true就可以了。
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();
}
}
当存在相当数字时p就赋值为false了
因为没有赋值true的处理
if( p ){
s++;
p = true; // 这句是废的
}
这个判断就永不成立 进入死循环四楼的那样修改就可以了PS: 貌似这里 break OUT 和continue OUT 效果一样?PS: 0.0 <= Math.random() < 1.0
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++;
}
写段代码吧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 中就是你想要的东西
=============
可以在:n=ran.nextInt(num)-1后面加一条语句
if(n<0)
n=n+1;
这样就没问题了..呵呵
这里应该用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));
当你有2个数重复了的时候p是false下面if里的代码根本走不到,s就不会++所以就挂了。
你可以参考一下楼上各位大虾的代码。
就这句(int) (Math.random() * 29) + 1;
其他的自己写啦
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上发贴,谁教教我怎么给分啊??
感谢上面给我提供算法的所有人,后来我在另外一个贴子里看到了下面的算法
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
}
贴出来大家也看看,我是新手,也不知道这个和你们上面发的有没有相同的。