[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个相同的值了吗,等下取还是会有重复的,这点也不懂
可我的程序检验了几次都是没重复的,可能我有点笨吧,请高手帮忙指点下,谢谢,快没分了,就只能给这么点了

解决方案 »

  1.   

    需要清一下缓存的。
    你试试在Radom之前,Flush一下。
      

  2.   

    我也是初学者哈
    我说哈我的意见哈
    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中没有重复
      

  3.   

    代码看的我晕的不行了,给你整理了。我在下面注释了,你看看吧。
    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); 


      

  4.   

    谢谢,太谢谢了,现在终于想通了,就算去最后一个数10,那10去覆盖10,由于a--k取值就变成[0,8],下标取不到9,也就等于取不到10了,假如第一次取的是其他的,那10去覆盖那个数,那个下标所对应的值变成10,而后a--,等于把最后一个10个剔除掉了,而现在数组上还是有10,只是下标变了一下。