[code=Java]
import java.util.*;
import java.math.*;
public class LotteryDrawing{
public static void main(String[]args)
{
Scanner in=new Scanner(System.in);
Random f=new Random();
System.out.print("彩球的总数");
int a=in.nextInt();
System.out.print("从彩球中抽取多少个?");
int b=in.nextInt();
int[] num=new int[a];
for(int i=0;i<num.length;i++)
num[i]=i+1;
int res[]=new int[b];
for(int i=0;i<res.length;i++)
{
int k=f.nextInt(a);
res[i]=num[k];
num[k]=num[a-1];
a--;
}
Arrays.sort(res);
for(int k:res)
System.out.println(k);
}
}
假如我现在从键盘上输入a=10,b=8,也就是说从10个彩球里面抽取8个,现在取随机数k,k最多等于9,假如我现在第1次取的就是9 res[0]=10;现在我想去用数组最后一个值也就是num[a-1]取覆盖,刚刚被随机取到的那个,发现这2个值相等了,这点很困惑,就算刚刚取到的是别的值,哪数组中最后一个去覆盖,哪数组中不是有2个相同的值了吗,等下取还是会有重复的,这点也不懂
可我的程序检验了几次都是没重复的,可能我有点笨吧,请高手帮忙指点下,谢谢,快没分了,就只能给这么点了
import java.util.*;
import java.math.*;
public class LotteryDrawing{
public static void main(String[]args)
{
Scanner in=new Scanner(System.in);
Random f=new Random();
System.out.print("彩球的总数");
int a=in.nextInt();
System.out.print("从彩球中抽取多少个?");
int b=in.nextInt();
int[] num=new int[a];
for(int i=0;i<num.length;i++)
num[i]=i+1;
int res[]=new int[b];
for(int i=0;i<res.length;i++)
{
int k=f.nextInt(a);
res[i]=num[k];
num[k]=num[a-1];
a--;
}
Arrays.sort(res);
for(int k:res)
System.out.println(k);
}
}
假如我现在从键盘上输入a=10,b=8,也就是说从10个彩球里面抽取8个,现在取随机数k,k最多等于9,假如我现在第1次取的就是9 res[0]=10;现在我想去用数组最后一个值也就是num[a-1]取覆盖,刚刚被随机取到的那个,发现这2个值相等了,这点很困惑,就算刚刚取到的是别的值,哪数组中最后一个去覆盖,哪数组中不是有2个相同的值了吗,等下取还是会有重复的,这点也不懂
可我的程序检验了几次都是没重复的,可能我有点笨吧,请高手帮忙指点下,谢谢,快没分了,就只能给这么点了
解决方案 »
- 送给java爱好者的一个帮助文件(全中文的)
- 关于this
- System.out.println(Character.getNumericValue('A')); 为何返回10 ?
- 如何在jtree的节点插入图片?
- *求最好方法*循环读取每行数据,判断第一个字符是否数字分别写入不同文本
- 8990357高级技术群,刚刚踢掉80多个人
- ----正则表达式的问题-----
- 如何实现动态指定List 泛型 实现自动化查询
- 澳洲国立大学作业题,大牛们给点意见啊
- 一个可以接收键盘事件的application修改成applet用IE查看时就无法接收键盘事件,请问应该如何处理?
- 问个replaceAll的问题
- JDBC
你试试在Radom之前,Flush一下。
我说哈我的意见哈
int k=f.nextInt(a);
res[i]=num[k];
num[k]=num[a-1];
a--;
我们假设第一次K取9哈
当a--;后K的最大值是不是只能取到8了
这么最后一个数组就取不到了不存在两个一样的值了撒
如果取的是中间的数组
是不是num[k]=num[a-1];就把它给覆盖了
所以呢在数组res中没有重复
import java.util.*;
//去掉了一个import语句,因为你没有用到。public class LotteryDrawing{
public static void main(String[]args){ Scanner in = new Scanner(System.in);
Random f = new Random();
System.out.print("彩球的总数");
int a = in.nextInt();
System.out.print("从彩球中抽取多少个?");
int b = in.nextInt();
int[] num = new int[a];
for(int i=0; i<num.length; i++)
num[i] = i+1; int res[] = new int[b];
for(int i=0;i <res.length;i++){ //关键是这个地方,根据res数组的长度,也就是你需要挑选球的个数来循环。
int k = f.nextInt(a); //假如你的a初始是10,k的取值范围是[0,9],然后取到的随机数k是7
res[i] = num[k]; //那么res数组的第1个元素,就是num[7]=8
num[k] = num[a-1]; //因为num[9]被取走了,所以当然不能再次被取出,因此就拿一个元素把它替换,也就是num[9],所以现在num数组中就没有8这个数字了,你就不可能重复取到这个数字了。
a--; //然后a自减,a=9,那么k的取值范围就变成[0,8]了。当然你会问假如我第一次取得恰好是最后一个,那不要紧啊,num[9] = num [10-1],还是不变,所以还是不会有重复的。
} Arrays.sort(res);
for(int k:res)
System.out.println(k);
}
}