import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class UnrepeatRandomNumber {
/**
* 使用Random类生成的随机数序列有元素的重复,可以采用以下两种方法生成不重复的随机数序列
* 1,排除法:利用Random随机生成数字,如果新生成的数字在以前没有出现过,则放入结果队列,否则继续生成下一个随机数
* 2,将所有可能生成的数字放到一个候选列表中,然后生成随机数K,作为下标,将候选列表中下标为K的数字放到结果列表中,
* 同时把它从候选列表中删除,继续生成下一个随机数作为下标,因为被选中的数字都不在候选队列中,
* 所以可以保证每次取得的随机数都是不相同的
* */
private int min;
private int max;
public UnrepeatRandomNumber(){
this.min = 0;
this.max = 0;
}
public UnrepeatRandomNumber(int min,int max){
this();
if(max>min){
this.min = min;
this.max = max;
}else{
System.out.println("max比min小,按默认值生成UnrepeatRandomNumber对象!");
}
}
public Integer[] getRandomMethodA(int length){
if(length<=0){
return new Integer[0];
}
else if(length>(this.max-this.min)){
System.out.println("结果列表长度不能达到:"+length+",结果长度只能是:"+(this.max-this.min));
length = this.max - this.max;
}
Random rd = new Random();
List resultList = new ArrayList();
while(resultList.size()<length){
Integer random = new Integer(this.min+rd.nextInt(this.max-this.min+1));
if(!resultList.contains(random)){
resultList.add(random);
}
}
return (Integer[])resultList.toArray(new Integer[0]);
}
public static void print(Integer [] n){
for(int i = 0;i<n.length;i++){
System.out.print(n[i]+" ");
}
}
public static void main(String[] args) {
UnrepeatRandomNumber test = new UnrepeatRandomNumber(5,15);
print(test.getRandomMethodA(8));
}
}
|
|