快速获取[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

posted on 2012-02-02 13:18  子非鱼焉  阅读(132)  评论(0编辑  收藏  举报

导航