第八版80页:
作者的意思是一个1-100的数组a【】,然后不重复的从中挑出10个数放入result数组(比如)
他每次从随机产生一个0-99的下标index, 然后把这个下标对应的书放入result数组中。
在处理不重复的问题是:他用a[index]=a[n-1] (n是a数组的长度100),就是用数组的最后一个数替代被选中的数
这样怎么能做到不重复呢?
我用长度10的数组抽8个数 结果就重复了?
谢谢!
------解决思路----------------------
假如我有一个10个数的数组,1 2 3 4 5 6 7 8 9 10,第一次我取一个10以内的随机数,例如取到的是3,则把3写入result数组,并且将源数组3和10对调一下,则原数组变成了1 2 10 4 5 6 7 8 9 3,接着我取一个9以内的随机数,这样不管取到的是几,我只能取前面9个数中的一个,3是第10个,肯定取不到,接着取8以内的随机数,依次类推,永远都取不到重复的。
不知道你又没有明白我的意思。
------解决思路----------------------
a[index]=a[n-1] (n是a数组的长度100) 楼主看一下这个n是不是变化的,n不变没法去重。楼上说的是一种方法,可以实现你说的效果。
------解决思路----------------------
代码如下:
import java.util.*;
public class LotteryDrawing{
public static void main(String[] args){
// 按照你的例子 原数组长度:10, 彩票数组长度:8
// [注意1]:此时原数组长度值等于原数组的真正长度
int 原数组长度值 = 10,k = 8;
int[] src = new int[原数组长度值];
for(int i=0; i<原数组长度值; i++){
src[i] = i+1; //[注意4]:每个下标对应的数都是唯一的
}
int[] result = new int[k];
for(int i=0; i<k; i++){
int index = (int)(Math.random() * 原数组长度值); // [注意3]:看完[注意2]再回看这条语句
result[i] = src[index];
src[index] = src[原数组长度值-1];
原数组长度值--;// [注意2]:此时原数组长度值小于原数组的真正长度
// 也就是下一次循环时[注意3]的"原数组长度值"已经小于真实长度了
// 所以[注意3]生成的下标一直在变小,后面的下标取不到因此避免重复
}
Arrays.sort(result); //易于查重
System.out.println(Arrays.toString(result));
}
}