快速獲取[0,n]之間的k個不同的隨機順序的隨機整數

如果生成位於0到n-1之間的k個不重複的隨機順序的整數呢?

/**
	 * 隨機抽取[0,n)之前的k個不同的數並隨機排序,(k<=n)
	 * 
	 * @param n
	 * @param k
	 * @return 隨機排序的數組,長度爲k
	 */
	public static int[] getRandomArray(int n, int k) {
		if (k > n) {
			k = n;
		}
		int[] rets = new int[k]; // 保存取出的隨機數
		int[] array = new int[n];// 定義初始數組
		for (int i = 0; i < n; i++)
			array[i] = i;
		Random random = new Random();
		for (int j = 0; j < k; j++) {
			int index = j + random.nextInt(n - j);// 生成一個[j,n)之間的隨機數,作爲數組下標
			// 交換array[j]和array[index],那麼array[0..j]爲已經獲取到的隨機數
			int temp = array[index];
			array[index] = array[j];
			array[j] = temp;
			// 把此次獲取到的隨機數存到rets裏面
			rets[j] = temp;
		}
		return rets;
	}

來自《編程珠璣(第二版)》第一章習題4
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章