洗牌算法-交換法

洗牌算法-交換法

即費雪耶茲(Fisher–Yates) 也被稱做高納德( Knuth)隨機置亂算法java


算法目的

  • 描述一:得到[n,m]區間的k個不重複隨機數/元素(獲取不重複隨機數)。
  • 描述二:將[n,m]區間的m-n個數隨機置亂(隨機數置亂)。

算法思想

​ 該算法每輪從序列可選範圍中隨機選取一個元素放入目標序列中,而後將該元素與序列可選範圍中最後一個元素相交換(若是隨機選中的是序列可選範圍最後的元素,則至關於沒有發生交換),再把序列可選範圍減1。重複此過程,直到填滿目標序列爲止。算法

限制性條件

  • n<m
  • k<=m-n
  • 序列可選範圍初始時爲整個初始序列的範圍

算法示例


  • ####目標數組

    從[0,9]區間隨機生成5個不重複隨機數dom

  • ####初始序列spa

    0 1 2 3 4 5 6 7 8 9.net

  • 執行流程

    第一輪code

    0 1 2 3 4 9 6 7 8 | 5 ---> 5blog

    第二輪 0 1 2 3 4 9 8 7 | 6 5 ---> 5 6get

    第三輪 0 1 2 3 4 7 8 | 9 6 5 ---> 5 6 9it

    第四輪 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;
}
相關文章
相關標籤/搜索