洗牌算法-交换法
洗牌算法-交换法
算法目的
- 描述一:获得[n,m]区间的k个不重复随机数/元素(获取不重复随机数)。
- 描述二:将[n,m]区间的m-n个数随机置乱(随机数置乱)。
算法思想
该算法每轮从序列可选范围中随机选取一个元素放入目标序列中,然后将该元素与序列可选范围中最后一个元素相交换(如果随机选中的是序列可选范围最后的元素,则相当于没有发生交换),再把序列可选范围减1。重复此过程,直到填满目标序列为止。
限制性条件
- n<m
- k<=m-n
- 序列可选范围初始时为整个初始序列的范围
算法示例
-
目标
从[0,9]区间随机生成5个不重复随机数
-
初始序列
0 1 2 3 4 5 6 7 8 9
-
执行流程
第一轮
0 1 2 3 4 9 6 7 8 | 5 ---> 5
第二轮
0 1 2 3 4 9 8 7 | 6 5 ---> 5 6第三轮
0 1 2 3 4 7 8 | 9 6 5 ---> 5 6 9第四轮
0 8 2 3 4 7 | 1 9 6 5 ---> 5 6 9 1第五轮
0 8 2 7 4 | 3 1 9 6 5 ---> 5 6 9 1 3 -
得到目标序列
5 6 9 1 3
-
实现
java代码:
//生成10个0-9间不重复随机数
static int[] defult = new int[100];
//初始化可选范围
static int range=100;
public static void main(String[] args) {
//目标数组
int[] targetArray = new int[100];
//初始化默认数组
for(int i=0;i<defult.length;i++) {
defult[i]=i;
}
Random ran = new Random(100);
for(int i=0;i<targetArray.length;i++) {
int ranNum =ran.nextInt(range);
targetArray[i]=defult[ranNum];
swap(ranNum,defult.length-i-1);
range--;
}
for(int i=0;i<targetArray.length;i++) {
System.out.println(targetArray[i]);
}
}
//交换
public static void swap(int startPosition,int endPosition) {
int temp = defult[startPosition];
defult[startPosition] = defult[endPosition];
defult[endPosition]=temp;
}